读书人

JPA 单向一对一联系关系(@OneToOne)

发布时间: 2012-09-23 10:28:11 作者: rapoo

JPA 单向一对一关联(@OneToOne)
下面以客户实体(CustomerEO)与地址实体(AddressEO)为例来说明如何映射一对一关系的映射.
一个客户对应一个地址,通过客户可以获得该客户的地址信息。客户和地址是一对一的关系,但通过地址不能获得客户信息,客户和地址是单向关联.

  Customer.javapackage com.demo.bean.onetoone;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToOne;import javax.persistence.Table;import javax.persistence.Version;/** * 客户实体与地址实体是单向的一对一的关系 */@Entity@Table(name = "t_customer")public class Customer {@Versionprivate Long version;@Id@GeneratedValueprivate Long id;//客户ID@Columnpublic String name;//客户名称//onetoone@OneToOne(cascade={CascadeType.ALL})@JoinColumn(name="address_id")public Address address;public Customer(){}//-----------------可省get,set--------------public Long getVersion() {return version;}public void setVersion(Long version) {this.version = version;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}}

  Address.javapackage com.demo.bean.onetoone;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Version;/** * entity  * */@Entity@Table(name="t_address")public class Address {@Versionprivate Long version;//version@Id@GeneratedValueprivate Long id;//idpublic String province;//省份public String city;//城市public String postcode;//邮编public String detail;//详细地址//----------get,set可省------------public Long getVersion() {return version;}public void setVersion(Long version) {this.version = version;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getPostcode() {return postcode;}public void setPostcode(String postcode) {this.postcode = postcode;}public String getDetail() {return detail;}public void setDetail(String detail) {this.detail = detail;}}

注意:
(1)在使用此@OneToOne标记时,需要注意以下几个问题。
????????? targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类。例如使用默认设置与以下所示的设置的效果相同。一般情况使用默认设置就可以了。
@OneToOne(targetEntity=AddressEO.class)public AddressEO getAddress() {return address;}

????????? cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式是当对实体进行操作时策略,默认情况下,不关联任何操作。
????????? fetch属性是该实体的加载方式,默认为及时加载EAGER,也可以使用惰性加载LAZY ,代码如下所示。
@OneToOne(fetch=FetchType.LAZY)public AddressEO getAddress() {return address;}

????????? optional属性表示关联的该实体是否能够存在null值。默认为true,表示可以存在null值。如果设置为false,则该实体不能为null,并且要同时配合使用@JoinColumn标记,将保存实体关系的字段设置为唯一的、不为null并且不能更新的,代码如下所示。
@OneToOne(optional=false)@JoinColumn(name = "address_id",unique=true, nullable=false, updatable=false)public AddressEO getAddress() {return address;}

使用这样的映射后,一个Customer实体必须对应一个Address实体,也就是说表customer中,address_id字段必须有值,不能为空值。

(2)在使用@JoinColumn注释时,应注意以下几个问题。
????????? @JoinColumn与@Column标记一样,是用于注释表中的字段的。它的属性与@Column属性有很多相同之处,这里就不详细讲述。请读者参阅5.2.2小节中有关@Column属性的部分。
????????? @JoinColumn与@JoinColumn相区别的是:@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上。而@Column标注的是表中不包含表关系的字段。
????????? 与@Column标记一样,name属性是用来标识表中所对应的字段的名称。例如customer表中存在字段addr_id,标识的代码如下所示。
@OneToOne@JoinColumn(name = "addr_id")public AddressEO getAddress() {return address;}

若此时,不设置name的值,则在默认情况下,name的取值遵循以下规则:
name=关联表的名称+“_”+ 关联表主键的字段名
提示:此规则只适用于与@OneToOne标记同时使用时。若与@ManyToOne或@ManyToMany标记同时使用时,将遵循其他的规则。
????????? 默认情况下,关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedColumnName属性。
@OneToOne@JoinColumn(name = "address_id",referencedColumnName="ref_id")public AddressEO getAddress() {return address;}
1 楼 sytcun 2011-11-06 超详细呀, 不错哈~

读书人网 >软件架构设计

热点推荐