eclipse + JBoss 5 + EJB3开发指南(7):实现Entity Bean的一对一(on
来源:互联网 发布:gui界面java字体大小 编辑:程序博客网 时间:2024/04/26 21:51
本文为原创,如需转载,请注明作者和出处,谢谢!
一对一映射是很常用的。在一般情况下,一个主表通过外键和从表形成一对一的关系。在EJB3中使用@OneToOne注释来映射。一对一关系除了使用外键进行关联外,也可以采用共享主键的方式连接两个表。先看看如下两个表的结构:
图2 t_referees
t_customers和t_referees表形成了一对一的关系。t_customers表通过referee_id与t_referees表相连。与t_customers表对应的实体Bean的代码如下:
- package entity;
- import java.util.Collection;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.OneToOne;
- import javax.persistence.Table;
- @Entity
- @Table(name = "t_customers")
- public class Customer
- {
- private int id;
- private String name;
- private Referee referee;
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- public int getId()
- {
- return id;
- }
- public void setId(int id)
- {
- this.id = id;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- @OneToOne
- public Referee getReferee()
- {
- return referee;
- }
- public void setReferee(Referee referee)
- {
- this.referee = referee;
- }
- }
从上面的代码可以看出,getReferee方法使用了@OneToOne进行设置。在装载Customer对象的同时,Referee对象会被同时装 载,而默认的外键字段就是Customer类中的referee属性名 + "_" + id,也就是referee_id。下面看一下与t_referees表对应的实体Bean代码:
- package entity;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.OneToOne;
- import javax.persistence.Table;
- @Entity
- @Table(name="t_referees")
- public class Referee
- {
- private int id;
- private String name;
- private Customer customer;
- @OneToOne(mappedBy="referee")
- public Customer getCustomer()
- {
- return customer;
- }
- public void setCustomer(Customer customer)
- {
- this.customer = customer;
- }
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- public int getId()
- {
- return id;
- }
- public void setId(int id)
- {
- this.id = id;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
Referee类使用了customer属性映射了Customer对象,实际上,这是一个双向的one-to-one映射。这时,在Referee类的 customer属性的getter方法的@OneToOne注释中,需要使用mappedBy属性来指定主表(Customer)中的映射从表的属性名 (referee)。
我们可以使用下面的代码进行测试:
- System.out.println(em.find(Referee.class, 1).getCustomer().getName());
- Customer customer = new Customer();
- customer.setName("微软");
- Referee referee = new Referee();
- referee.setName("赵军");
- em.persist(referee);
- customer.setReferee(referee);
- em.persist(customer);
如果要覆盖默认的名键名,例如,外键名为referee1_id,可以两种方法使EJB3容器使用新的外键:
1. 修改Customer类中的referee属性的getter和setter方法为getReferee1和setReferee1,并将Referee类中mappedBy属性的值修改成referee1。
2. 使用@JoinColumn注释设置新的外键名,这种方法只需要修改Customer类的getReferee方法上面注释即可,代码如下:
- @OneToOne
- @JoinColumn(name="referee1_id")
- public Referee getReferee()
- {
- return referee;
- }
one-to-one关系还可以共享主键,也就是一个表的主键的值依赖于另一个表的主键的值。因此,在这种情况下,就不再需要t_customers表中 的referee_id字段了。由于t_referees表的id字段值依赖于t_customers表的id字段值,因此,需要将t_referees 表中的id字段值的自增类型去掉。
在EJB3中使用@PrimaryKeyJoinColumn注释来实现主键的共享。首先需要修改Customer类的getReferee方法上方的注释,修改后的代码如下:
- @OneToOne(cascade=CascadeType.ALL)
- @PrimaryKeyJoinColumn
- public Referee getReferee()
- {
- return referee;
- }
然后要修改Referee类中的getCustomer和getId方法上方的注释,修改后的代码如下:
- @OneToOne
- @PrimaryKeyJoinColumn
- public Customer getCustomer()
- {
- return customer;
- }
- @Id
- @GeneratedValue(generator = "pkGenerator")
- @GenericGenerator(name = "pkGenerator", strategy = "foreign",
- parameters = @Parameter(name = "property", value = "customer"))
- public int getId()
- {
- return id;
- }
其中@GenericGenerator注释表示这个id属性是外键,并且依赖于customer属性对应的实体Bean的id属性值(主键值)。
另外还要注意一点,由于t_referees表的id的自增类型已经去掉,而且该值依赖于t_customers表的id字段值,因此,就不能直接持久化Referee对象了,而在持久化Customer对象的同时,EJB3容器会自动将Referee持久化的。
- eclipse + JBoss 5 + EJB3开发指南(7):实现Entity Bean的一对一(on
- eclipse + JBoss 5 + EJB3开发指南(7):实现Entity Bean的一对一(one-to-one)映射
- eclipse + JBoss 5 + EJB3开发指南(8):实现Entity Bean的一对多(on
- eclipse + JBoss 5 + EJB3开发指南(9):实现Entity Bean的多对多(ma
- eclipse + JBoss 5 + EJB3开发指南(9):实现Entity Bean的多对多(many-to-many)映射
- eclipse + JBoss 5 + EJB3开发指南(8):实现Entity Bean的一对多(one-to-many)映射
- eclipse + JBoss 5 + EJB3开发指南(11):实体Bean的连接策略(JOINED Strategy)
- eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
- eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
- eclipse + JBoss 5 + EJB3开发指南(11):实体Bean的连接策略
- eclipse + JBoss 5 + EJB3开发指南(5):使用配置文件发布Session Bean
- eclipse + JBoss 5 + EJB3开发指南(14):消息驱动Bean
- eclipse + JBoss 5 + EJB3开发指南(6):编写第一个实体Bean程序
- eclipse + JBoss 5 + EJB3开发指南(4):Session Bean中的注释方法
- eclipse + JBoss 5 + EJB3开发指南(4):Session Bean中的注释方法
- eclipse + JBoss 5 + EJB3开发指南(6):编写第一个实体Bean程序
- eclipse + JBoss 5 + EJB3开发指南(14):消息驱动Bean
- eclipse + JBoss 5 + EJB3开发指南(2):编写有状态的SessionBean
- 在校生如何学习VC及该怎么看书
- NetBeans下实现JAVA GUI中的鼠标拖放效果(09.06.09)
- 他在你心中是什么颜色
- 好好学习
- 不要在Unix下遍桌面程序(2)《精通Unix下C语言与项目实践》读
- eclipse + JBoss 5 + EJB3开发指南(7):实现Entity Bean的一对一(on
- X264运行提示“cannot execute program ” 提示框
- 计算机 不等于 PC机
- 关于Windows/Linux
- c语言学生举手求教大本营老师和同学!
- 无聊 没有方向~
- 刚入学堂啊
- 找出两个数中比较大的
- 量化