hibernate基于外键的双向1-1关系映射

来源:互联网 发布:时时彩数据分析大师 编辑:程序博客网 时间:2024/05/16 17:49

对于双向1-1关联而言,两端都需要使用@OneToOne注解进行关联,好了废话不多说直接上例子

1、首先创建数据库数据库采用sql sever 2008 r2 

创建person表

创建address表

进行主外键关系的添加

2、用hibernate反向工程生成他们的实体类

person的实体类

package com.wxb.model;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.OneToOne;import static javax.persistence.GenerationType.IDENTITY;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import org.hibernate.annotations.Cascade;import org.hibernate.annotations.CascadeType;/** * PersonInf entity. *  * @author 王校兵 * @version 1.0, 2015-11-27 */@Entity@Table(name = "person_inf")public class PersonInf implements java.io.Serializable {private Integer personId;private Integer age;private String name;private AddressInf addressInf;@Id@GeneratedValue(strategy = IDENTITY)@Column(name = "person_id")public Integer getPersonId() {return this.personId;}public Integer getAge() {return this.age;}public String getName() {return this.name;}@OneToOne(mappedBy = "personInf")@Cascade(CascadeType.ALL)public AddressInf getAddressInf() {return this.addressInf;}public void setAddressInf(AddressInf addressInf) {this.addressInf = addressInf;}public void setAge(Integer age) {this.age = age;}public void setName(String name) {this.name = name;}public void setPersonId(Integer personId) {this.personId = personId;}}
address的实体类

package com.wxb.model;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.JoinColumn;import javax.persistence.OneToOne;import static javax.persistence.GenerationType.IDENTITY;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;import org.hibernate.annotations.Cascade;import org.hibernate.annotations.CascadeType;/** * PersonInf entity. *  * @author 王校兵 * @version 1.0, 2015-11-27 */@Entity@Table(name = "address_inf")public class AddressInf implements java.io.Serializable {private Integer addressId;private String addressDetial;private PersonInf personInf;public AddressInf(String addressDetial) {this.addressDetial = addressDetial;}@Id@GeneratedValue(strategy = IDENTITY)@Column(name="address_id")public Integer getAddressId() {return this.addressId;}public AddressInf() {super();}public String getAddressDetial() {return this.addressDetial;}@OneToOne(targetEntity = PersonInf.class)@JoinColumn(name = "address_id", unique = true)@Cascade(CascadeType.ALL)public PersonInf getPersonInf() {return personInf;}public void setAddressDetial(String addressDetial) {this.addressDetial = addressDetial;}public void setAddressId(Integer addressId) {this.addressId = addressId;}public void setPersonInf(PersonInf personInf) {this.personInf = personInf;}}
3、创建他们的测试类
<span style="white-space:pre"></span><pre name="code" class="java">package com.wxb.dao;import org.hibernate.Session;import org.hibernate.Transaction;import com.wxb.model.AddressInf;import com.wxb.model.PersonInf;import com.wxb.util.HibernateSessionFactory;/** * 双向一对一关联映射测试类 * @author 王校兵 * @version 1.0, 2015-11-27 * */public class BothOneToOneDao {public static void main(String[] args) {Session session = HibernateSessionFactory.getSession();Transaction ts = session.beginTransaction();PersonInf p = (PersonInf) session.get(PersonInf.class, 20);System.out.println(p.getAddressInf().getAddressDetial());AddressInf a = (AddressInf) session.get(AddressInf.class, 20);System.out.println(a.getPersonInf().getName());ts.commit();}}

通过这些步骤的配置就可以实现双向一对一的映射;

小小的总结一些要注意的地方

1、对于基于外键的,外键可以放在任意的一端,存放外键的一端需要增加@JoinColumn注解来映射外键列,还应该增加unique=true属性来表示该实体实际上是1的一端

2、对于一对一的关联关系,两个实体原本处于平等状态,但是当选择任意一端来增加外键后(增加@JoinColumn注解的实体段)该表即变成从表,而另一个表则成为主表

0 0
原创粉丝点击