`
haierboos
  • 浏览: 439163 次
文章分类
社区版块
存档分类
最新评论

eclipse + JBoss 5 + EJB3开发指南(8):实现Entity Bean的一对多(on

 
阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

EJB3的一对多映射使用@OneToMany来设置,如果是双向的一对多映射,在many方需要使用@ManyToOne设置。在本书中给出两个表,其他一个表t_customers在上一篇文章中已给出了,另一个表的结构如图1所示。

图1 t_orders表

t_customers和t_orders表是一对多关系,一个Customer可能有多个Order,而一个Order只能有一个Customer。
在Customer类中需要定义一个集合类型的属性,用来保存多个Order对象,Customer类的代码如下:

Code:
  1. packageentity;
  2. importjava.util.Collection;
  3. importjavax.persistence.CascadeType;
  4. importjavax.persistence.Entity;
  5. importjavax.persistence.FetchType;
  6. importjavax.persistence.GeneratedValue;
  7. importjavax.persistence.GenerationType;
  8. importjavax.persistence.Id;
  9. importjavax.persistence.JoinColumn;
  10. importjavax.persistence.JoinTable;
  11. importjavax.persistence.ManyToMany;
  12. importjavax.persistence.OneToMany;
  13. importjavax.persistence.OneToOne;
  14. importjavax.persistence.PrimaryKeyJoinColumn;
  15. importjavax.persistence.Table;
  16. @Entity
  17. @Table(name="t_customers")
  18. publicclassCustomer
  19. {
  20. privateintid;
  21. privateStringname;
  22. privateRefereereferee;
  23. privateCollection<Order>orders;
  24. @OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
  25. publicCollection<Order>getOrders()
  26. {
  27. returnorders;
  28. }
  29. publicvoidsetOrders(Collection<Order>orders)
  30. {
  31. this.orders=orders;
  32. }
  33. @Id
  34. @GeneratedValue(strategy=GenerationType.IDENTITY)
  35. publicintgetId()
  36. {
  37. returnid;
  38. }
  39. ......
  40. }

其中@OneToMany的mappedBy属性指定了Order类中获得Customer对象的属性名。Order类的代码如下:

Code:
  1. packageentity;
  2. importjavax.persistence.Column;
  3. importjavax.persistence.Entity;
  4. importjavax.persistence.GeneratedValue;
  5. importjavax.persistence.GenerationType;
  6. importjavax.persistence.Id;
  7. importjavax.persistence.JoinColumn;
  8. importjavax.persistence.JoinColumns;
  9. importjavax.persistence.JoinTable;
  10. importjavax.persistence.ManyToOne;
  11. importjavax.persistence.Table;
  12. @Entity
  13. @Table(name="t_orders")
  14. publicclassOrder
  15. {
  16. privateintid;
  17. privateStringproductId;
  18. privateintcount;
  19. privateCustomercustomer;
  20. @ManyToOne
  21. @JoinColumn(name="customer_id")
  22. publicCustomergetCustomer()
  23. {
  24. returncustomer;
  25. }
  26. publicvoidsetCustomer(Customercustomer)
  27. {
  28. this.customer=customer;
  29. }
  30. @Id
  31. @GeneratedValue(strategy=GenerationType.IDENTITY)
  32. publicintgetId()
  33. {
  34. returnid;
  35. }
  36. ......
  37. }

其中@JoinColumn注释的name属性指定t_orders表中用于连接t_customers表的外键名。
可以使用下面的代码进行测试:

Code:
  1. Customercustomer=newCustomer();
  2. customer.setName("微软");
  3. List<Order>orders=newArrayList<Order>();
  4. Orderorder=newOrder();
  5. order.setProductId("1234");
  6. order.setCount(20);
  7. order.setCustomer(customer);
  8. orders.add(order);
  9. order=newOrder();
  10. order.setProductId("4321");
  11. order.setCount(12);
  12. order.setCustomer(customer);
  13. orders.add(order);
  14. customer.setOrders(orders);
  15. em.persist(customer);

除此之外,还可以使用@JoinTable指定连接表来映射one-to-many关系。连接表的结构如图2所示。

图2 t_customers_orders表

首选需要将Customer类的getOrders方法修改成下的形式:

Code:
  1. @OneToMany
  2. @JoinTable(name="t_customers_orders",joinColumns=@JoinColumn(name="t_customers_id",
  3. referencedColumnName="id"),inverseJoinColumns=
  4. @JoinColumn(name="orders_id",referencedColumnName="id"))
  5. publicCollection<Order>getOrders()
  6. {
  7. returnorders;
  8. }
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->

其中name属性指定图2所示的连接表的名称。joinColumns指定了t_customers表和t_customers_orders表中相连接 的字段。inverseJoinColumns指定了t_orders表和t_customers_orders表中相连接的字段。这时t_orders 表中的customer_id字段就不再需要了。因此,需要将Order表中的customer属性(getter和setter方法)去掉。

在持久化Customer和Order对象时,需要对Order对象进行持久化后才能对Customer对象进行持久化。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics