新聞中心
一對一映射是很常用的。在一般情況下,一個主表通過外鍵和從表形成一對一的關(guān)系。在EJB3中使用@OneToOne注釋來映射。一對一關(guān)系除了使用外鍵進(jìn)行關(guān)聯(lián)外,也可以采用共享主鍵的方式連接兩個表。先看看如下兩個表的結(jié)構(gòu):

創(chuàng)新互聯(lián)是一家專業(yè)提供平泉企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、H5場景定制、小程序制作等業(yè)務(wù)。10年已為平泉眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
圖1 t_customers
圖2 t_referees
t_customers和t_referees表形成了一對一的關(guān)系。t_customers表通過referee_id與t_referees表相連。與t_customers表對應(yīng)的實(shí)體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進(jìn)行設(shè)置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認(rèn)的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應(yīng)的實(shí)體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對象,實(shí)際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。
我們可以使用下面的代碼進(jìn)行測試:
- 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);
如果要覆蓋默認(rèn)的名鍵名,例如,外鍵名為referee1_id,可以兩種方法使EJB3容器使用新的外鍵:
1. 修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,并將Referee類中mappedBy屬性的值修改成referee1。
2. 使用@JoinColumn注釋設(shè)置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:
- @OneToOne
- @JoinColumn(name="referee1_id")
- public Referee getReferee()
- {
- return referee;
- }
one-to-one關(guān)系還可以共享主鍵,也就是一個表的主鍵的值依賴于另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依賴于t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。
在EJB3中使用@PrimaryKeyJoinColumn注釋來實(shí)現(xiàn)主鍵的共享。首先需要修改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屬性對應(yīng)的實(shí)體Bean的id屬性值(主鍵值)。
另外還要注意一點(diǎn),由于t_referees表的id的自增類型已經(jīng)去掉,而且該值依賴于t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。
【編輯推薦】
- Eclipse+JBoss+EJB3配置文件發(fā)布Session Bean
- Eclipse+JBoss+EJB3編寫有狀態(tài)的SessionBean
- Eclipse+JBoss+EJB3的Session Bean注釋方法
- Eclipse+JBoss+EJB3使用Session Bean的本地接口
- Eclipse+JBoss+EJB3編寫第一個實(shí)體Bean程序
名稱欄目:Eclipse+JBoss+EJB3實(shí)現(xiàn)EntityBean的一對一映射
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/coiccsc.html


咨詢
建站咨詢
