程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> Eclipse+JBoss+EJB3實現Entity Bean的一對一映射

Eclipse+JBoss+EJB3實現Entity Bean的一對一映射

編輯:J2EE

一對一映射是很常用的。在一般情況下,一個主表通過外鍵和從表形成一對一的關系。在EJB3中使用@OneToOne注釋來映射。一對一關系除了使用外鍵進行關聯外,也可以采用共享主鍵的方式連接兩個表。先看看如下兩個表的結構:

t_customers 圖1 t_customers
t_referees

圖2 t_referees

t_customers和t_referees表形成了一對一的關系。t_customers表通過referee_id與t_referees表相連。與t_customers表對應的實體Bean的代碼如下:

  1. package entity;
  2. import Java.util.Collection;
  3. import Javax.persistence.Entity;
  4. import Javax.persistence.FetchType;
  5. import Javax.persistence.GeneratedValue;
  6. import Javax.persistence.GenerationType;
  7. import Javax.persistence.Id;
  8. import Javax.persistence.JoinColumn;
  9. import Javax.persistence.OneToOne;
  10. import Javax.persistence.Table;
  11. @Entity
  12. @Table(name = "t_customers")
  13. public class Customer
  14. {
  15. private int id;
  16. private String name;
  17. private Referee referee;
  18. @Id
  19. @GeneratedValue(strategy = GenerationType.IDENTITY)
  20. public int getId()
  21. {
  22. return id;
  23. }
  24. public void setId(int id)
  25. {
  26. this.id = id;
  27. }
  28. public String getName()
  29. {
  30. return name;
  31. }
  32. public void setName(String name)
  33. {
  34. this.name = name;
  35. }
  36. @OneToOne
  37. public Referee getReferee()
  38. {
  39. return referee;
  40. }
  41. public void setReferee(Referee referee)
  42. {
  43. this.referee = referee;
  44. }
  45. }

從上面的代碼可以看出,getReferee方法使用了@OneToOne進行設置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應的實體Bean代碼:

  1. package entity;
  2. import Javax.persistence.Entity;
  3. import Javax.persistence.GeneratedValue;
  4. import Javax.persistence.GenerationType;
  5. import Javax.persistence.Id;
  6. import Javax.persistence.JoinColumn;
  7. import Javax.persistence.OneToOne;
  8. import Javax.persistence.Table;
  9. @Entity
  10. @Table(name="t_referees")
  11. public class Referee
  12. {
  13. private int id;
  14. private String name;
  15. private Customer customer;
  16. @OneToOne(mappedBy="referee")
  17. public Customer getCustomer()
  18. {
  19. return customer;
  20. }
  21. public void setCustomer(Customer customer)
  22. {
  23. this.customer = customer;
  24. }
  25. @Id
  26. @GeneratedValue(strategy = GenerationType.IDENTITY)
  27. public int getId()
  28. {
  29. return id;
  30. }
  31. public void setId(int id)
  32. {
  33. this.id = id;
  34. }
  35. public String getName()
  36. {
  37. return name;
  38. }
  39. public void setName(String name)
  40. {
  41. this.name = name;
  42. }
  43. }

Referee類使用了customer屬性映射了Customer對象,實際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。

我們可以使用下面的代碼進行測試:

  1. System.out.println(em.find(Referee.class, 1).getCustomer().getName());
  2. Customer customer = new Customer();
  3. customer.setName("微軟");
  4. Referee referee = new Referee();
  5. referee.setName("趙軍");
  6. em.persist(referee);
  7. customer.setReferee(referee);
  8. em.persist(customer);

如果要覆蓋默認的名鍵名,例如,外鍵名為referee1_id,可以兩種方法使EJB3容器使用新的外鍵:

1. 修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,並將Referee類中mappedBy屬性的值修改成referee1。

2. 使用@JoinColumn注釋設置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:

  1. @OneToOne
  2. @JoinColumn(name="referee1_id")
  3. public Referee getReferee()
  4. {
  5. return referee;
  6. }

one-to-one關系還可以共享主鍵,也就是一個表的主鍵的值依賴於另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由於t_referees表的id字段值依賴於t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。

在EJB3中使用@PrimaryKeyJoinColumn注釋來實現主鍵的共享。首先需要修改Customer類的getReferee方法上方的注釋,修改後的代碼如下:

  1. @OneToOne(cascade=CascadeType.ALL)
  2. @PrimaryKeyJoinColumn
  3. public Referee getReferee()
  4. {
  5. return referee;
  6. } 然後要修改Referee類中的getCustomer和getId方法上方的注釋,修改後的代碼如下:
  7. @OneToOne
  8. @PrimaryKeyJoinColumn
  9. public Customer getCustomer()
  10. {
  11. return customer;
  12. }
  13. @Id
  14. @GeneratedValue(generator = "pkGenerator")
  15. @GenericGenerator(name = "pkGenerator", strategy = "foreign",
  16. parameters = @Parameter(name = "property", value = "customer"))
  17. public int getId()
  18. {
  19. return id;
  20. }

其中@GenericGenerator注釋表示這個id屬性是外鍵,並且依賴於customer屬性對應的實體Bean的id屬性值(主鍵值)。

另外還要注意一點,由於t_referees表的id的自增類型已經去掉,而且該值依賴於t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved