本文為原創,如需轉載,請注明作者和出處,謝謝!
上一篇: eclipse + JBoss 5 + EJB3開發指南(6):編寫第一個實體Bean程序
一對一映射是很常用的。在一般情況下,一個主表通過外鍵和從表形成一對一的關系。在EJB3中使用@OneToOne注釋來映射。一對一關系除了使用外鍵進行關聯外,也可以采用共享主鍵的方式連接兩個表。先看看如下兩個表的結構:
從上面的代碼可以看出,getReferee方法使用了@OneToOne進行設置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應的實體Bean代碼:
Referee類使用了customer屬性映射了Customer對象,實際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。
我們可以使用下面的代碼進行測試:
1. 修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,并將Referee類中mappedBy屬性的值修改成referee1。
2. 使用@JoinColumn注釋設置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:
one-to-one關系還可以共享主鍵,也就是一個表的主鍵的值依賴于另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依賴于t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。
在EJB3中使用@PrimaryKeyJoinColumn注釋來實現主鍵的共享。首先需要修改Customer類的getReferee方法上方的注釋,修改后的代碼如下:
另外還要注意一點,由于t_referees表的id的自增類型已經去掉,而且該值依賴于t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。
下一篇: eclipse + JBoss 5 + EJB3開發指南(8):實現Entity Bean的一對多(one-to-many)映射
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》 發布
《Java Web開發速學寶典》 出版,歡迎定購
上一篇: eclipse + JBoss 5 + EJB3開發指南(6):編寫第一個實體Bean程序
一對一映射是很常用的。在一般情況下,一個主表通過外鍵和從表形成一對一的關系。在EJB3中使用@OneToOne注釋來映射。一對一關系除了使用外鍵進行關聯外,也可以采用共享主鍵的方式連接兩個表。先看看如下兩個表的結構:

圖1 t_customers

圖2 t_referees
t_customers和t_referees表形成了一對一的關系。t_customers表通過referee_id與t_referees表相連。與t_customers表對應的實體Bean的代碼如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
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 Stringname;
private Refereereferee;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
public void setId( int id)
{
this .id = id;
}
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
@OneToOne
public RefereegetReferee()
{
return referee;
}
public void setReferee(Refereereferee)
{
this .referee = referee;
}
}
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 Stringname;
private Refereereferee;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
public void setId( int id)
{
this .id = id;
}
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
@OneToOne
public RefereegetReferee()
{
return referee;
}
public void setReferee(Refereereferee)
{
this .referee = referee;
}
}
從上面的代碼可以看出,getReferee方法使用了@OneToOne進行設置。在裝載Customer對象的同時,Referee對象會被同時裝載,而默認的外鍵字段就是Customer類中的referee屬性名 + "_" + id,也就是referee_id。下面看一下與t_referees表對應的實體Bean代碼:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
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 Stringname;
private Customercustomer;
@OneToOne(mappedBy = " referee " )
public CustomergetCustomer()
{
return customer;
}
public void setCustomer(Customercustomer)
{
this .customer = customer;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
public void setId( int id)
{
this .id = id;
}
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
}
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 Stringname;
private Customercustomer;
@OneToOne(mappedBy = " referee " )
public CustomergetCustomer()
{
return customer;
}
public void setCustomer(Customercustomer)
{
this .customer = customer;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
public void setId( int id)
{
this .id = id;
}
public StringgetName()
{
return name;
}
public void setName(Stringname)
{
this .name = name;
}
}
Referee類使用了customer屬性映射了Customer對象,實際上,這是一個雙向的one-to-one映射。這時,在Referee類的customer屬性的getter方法的@OneToOne注釋中,需要使用mappedBy屬性來指定主表(Customer)中的映射從表的屬性名(referee)。
我們可以使用下面的代碼進行測試:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
System.out.println(em.find(Referee.
class
,
1
).getCustomer().getName());
Customercustomer = new Customer();
customer.setName( " 微軟 " );
Refereereferee = new Referee();
referee.setName( " 趙軍 " );
em.persist(referee);
customer.setReferee(referee);
em.persist(customer);
如果要覆蓋默認的名鍵名,例如,外鍵名為referee1_id,可以兩種方法使EJB3容器使用新的外鍵:
Customercustomer = new Customer();
customer.setName( " 微軟 " );
Refereereferee = new Referee();
referee.setName( " 趙軍 " );
em.persist(referee);
customer.setReferee(referee);
em.persist(customer);
1. 修改Customer類中的referee屬性的getter和setter方法為getReferee1和setReferee1,并將Referee類中mappedBy屬性的值修改成referee1。
2. 使用@JoinColumn注釋設置新的外鍵名,這種方法只需要修改Customer類的getReferee方法上面注釋即可,代碼如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
@OneToOne
@JoinColumn(name = " referee1_id " )
public RefereegetReferee()
{
return referee;
}
@JoinColumn(name = " referee1_id " )
public RefereegetReferee()
{
return referee;
}
one-to-one關系還可以共享主鍵,也就是一個表的主鍵的值依賴于另一個表的主鍵的值。因此,在這種情況下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依賴于t_customers表的id字段值,因此,需要將t_referees表中的id字段值的自增類型去掉。
在EJB3中使用@PrimaryKeyJoinColumn注釋來實現主鍵的共享。首先需要修改Customer類的getReferee方法上方的注釋,修改后的代碼如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
@OneToOne(cascade
=
CascadeType.ALL)
@PrimaryKeyJoinColumn
public RefereegetReferee()
{
return referee;
}
然后要修改Referee類中的getCustomer和getId方法上方的注釋,修改后的代碼如下:
@PrimaryKeyJoinColumn
public RefereegetReferee()
{
return referee;
}
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
@OneToOne
@PrimaryKeyJoinColumn
public CustomergetCustomer()
{
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屬性對應的實體Bean的id屬性值(主鍵值)。
@PrimaryKeyJoinColumn
public CustomergetCustomer()
{
return customer;
}
@Id
@GeneratedValue(generator = " pkGenerator " )
@GenericGenerator(name = " pkGenerator " ,strategy = " foreign " ,
parameters = @Parameter(name = " property " ,value = " customer " ))
public int getId()
{
return id;
}
另外還要注意一點,由于t_referees表的id的自增類型已經去掉,而且該值依賴于t_customers表的id字段值,因此,就不能直接持久化Referee對象了,而在持久化Customer對象的同時,EJB3容器會自動將Referee持久化的。
下一篇: eclipse + JBoss 5 + EJB3開發指南(8):實現Entity Bean的一對多(one-to-many)映射
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》 發布
《Java Web開發速學寶典》 出版,歡迎定購
eclipse + JBoss 5 + EJB3開發指南(7):實現Entity Bean的一對一(one-to-one)映射
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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