上一篇: eclipse + JBoss 5 + EJB3開發指南(7):實現Entity Bean的一對一(one-to-one)映射
EJB3的一對多映射使用@OneToMany來設置,如果是雙向的一對多映射,在many方需要使用@ManyToOne設置。在本書中給出兩個表,其他一個表t_customers在上一篇文章中已給出了,另一個表的結構如圖1所示。

在Customer類中需要定義一個集合類型的屬性,用來保存多個Order對象,Customer類的代碼如下:
import java.util.Collection;
import javax.persistence.CascadeType;
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.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
@Entity
@Table(name = " t_customers " )
public class Customer
{
private int id;
private Stringname;
private Refereereferee;
private Collection < Order > orders;
@OneToMany(mappedBy = " customer " ,cascade = CascadeType.ALL)
public Collection < Order > getOrders()
{
return orders;
}
public void setOrders(Collection < Order > orders)
{
this .orders = orders;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
... ...
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = " t_orders " )
public class Order
{
private int id;
private StringproductId;
private int count;
private Customercustomer;
@ManyToOne
@JoinColumn(name = " customer_id " )
public CustomergetCustomer()
{
return customer;
}
public void setCustomer(Customercustomer)
{
this .customer = customer;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
... ...
}
可以使用下面的代碼進行測試:
customer.setName( " 微軟 " );
List < Order > orders = new ArrayList < Order > ();
Orderorder = new Order();
order.setProductId( " 1234 " );
order.setCount( 20 );
order.setCustomer(customer);
orders.add(order);
order = new Order();
order.setProductId( " 4321 " );
order.setCount( 12 );
order.setCustomer(customer);
orders.add(order);
customer.setOrders(orders);
em.persist(customer);
除此之外,還可以使用@JoinTable指定連接表來映射one-to-many關系。連接表的結構如圖2所示。

首選需要將Customer類的getOrders方法修改成下的形式:
@JoinTable(name = " t_customers_orders " ,joinColumns = @JoinColumn(name = " t_customers_id " ,
referencedColumnName = " id " ),inverseJoinColumns =
@JoinColumn(name = " orders_id " ,referencedColumnName = " id " ))
public Collection < Order > getOrders()
{
return orders;
}
其中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對象進行持久化。
下一篇: eclipse + JBoss 5 + EJB3開發指南(9):實現Entity Bean的多對多(many-to-many)映射
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》 發布
《Java Web開發速學寶典》 出版,歡迎定購
eclipse + JBoss 5 + EJB3開發指南(8):實現Entity Bean的一對多(one-to-many)映射
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
