Eclipse+JBoss+EJB3实现Entity Bean的多对多映射

2009-12-1     作者:   编辑:崔晓帆        点击进入论坛
关键词:Eclipse  JBoss  EJB3  Entit

  在EJB3中需要使用@ManyToMany对封装多对多关系的字段或getter方法进行注释。先看看下面的表:

t_addresses表

  图1 t_addresses表

  t_addresses表和t_customers表是多对多的关系。需要使用一个关联表来描述这种关系,关联表的结构如下图所示。

t_customers_addresses

  图2 t_customers_addresses

  在Customer类中定义一个Collection < ADDRESS>类型的字段(addresses),用于保存与该Customer对象相对应的多个Address对象,代码如下:

  1. package entity;
  2. import java.util.Collection;
  3. import javax.persistence.CascadeType;
  4. import javax.persistence.Entity;
  5. import javax.persistence.FetchType;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.GenerationType;
  8. import javax.persistence.Id;
  9. import javax.persistence.JoinColumn;
  10. import javax.persistence.JoinTable;
  11. import javax.persistence.ManyToMany;
  12. import javax.persistence.OneToMany;
  13. import javax.persistence.OneToOne;
  14. import javax.persistence.PrimaryKeyJoinColumn;
  15. import javax.persistence.Table;
  16. @Entity
  17. @Table(name = "t_customers")
  18. public class Customer
  19. {
  20. private int id;
  21. private String name;
  22. private Referee referee;
  23. private Collection< Order> orders;
  24. private Collection< Address> addresses;
  25. @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  26. @JoinTable(name = "t_customers_addresses", joinColumns = @JoinColumn(name = "customer_id",
  27. referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"))
  28. public Collection< Address> getAddresses()
  29. {
  30. return addresses;
  31. }
  32. ... ...
  33. }
  34. @JoinTable注释用于指定连接表和t_customers及t_addresses表的连接字段关系。
  35. Address类的代码如下:
  36. package entity;
  37. import java.util.Collection;
  38. import javax.persistence.CascadeType;
  39. import javax.persistence.Entity;
  40. import javax.persistence.FetchType;
  41. import javax.persistence.GeneratedValue;
  42. import javax.persistence.GenerationType;
  43. import javax.persistence.Id;
  44. import javax.persistence.ManyToMany;
  45. import javax.persistence.Table;
  46. @Entity
  47. @Table(name="t_addresses")
  48. public class Address
  49. {
  50. private int id;
  51. private String addressLine;
  52. private String country;
  53. private String postCode;
  54. private Collection< Customer> customers;
  55. @Id
  56. @GeneratedValue(strategy=GenerationType.IDENTITY)
  57. public int getId()
  58. {
  59. return id;
  60. }
  61. public void setId(int id)
  62. {
  63. this.id = id;
  64. }
  65. public String getAddressLine()
  66. {
  67. return addressLine;
  68. }
  69. public void setAddressLine(String addressLine)
  70. {
  71. this.addressLine = addressLine;
  72. }
  73. public String getCountry()
  74. {
  75. return country;
  76. }
  77. public void setCountry(String country)
  78. {
  79. this.country = country;
  80. }
  81. public String getPostCode()
  82. {
  83. return postCode;
  84. }
  85. public void setPostCode(String postCode)
  86. {
  87. this.postCode = postCode;
  88. }
  89. @ManyToMany(mappedBy="addresses")
  90. public Collection< Customer> getCustomers()
  91. {
  92. return customers;
  93. }
  94. public void setCustomers(Collection< Customer> customers)
  95. {
  96. this.customers = customers;
  97. }
  98. }

由于是多对多的关系,因此,在Address类中需要定义一个Collection类型的字段(customers)用来保存与该Address对象相对应的Customer对象。getCustomers方法也需要使用@ManyToMany进行注释。可以使用下面代码进行测试:

  1. Customer customer = new Customer();
  2. customer.setName("微软11");
  3. List< Address> addresses = new ArrayList< Address>();
  4. Address address = new entity.Address();
  5. address.setAddressLine("address1");
  6. address.setCountry("中国");
  7. address.setPostCode("12345678");
  8. addresses.add(address);
  9. address = new entity.Address();
  10. address.setAddressLine("address2");
  11. address.setCountry("美国");
  12. address.setPostCode("4321");
  13. addresses.add(address);
  14. customer.setAddresses(addresses);
  15. em.persist(customer);
寻找产品:
姓       名: 电   话:
公       司: E-mail:
描       述: