1. 基于外键的双向1-1关联

对于基于外键的双向1-1关联,外键可以存放在任意一端。只要选择了任意一端来作为增加外键后,该表就变成了主表,另一张表就是从表。主表不应该有关联关系的控制,所以在@OneToOne注解时,加上mappedBy属性(为了不增加额外的update语句,下降性能)。下面,我们选择Person为主表。

@Entity
@Table(name="person_inf")
public class Person
{// 标识属性@Id @Column(name="person_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String name;private int age;// 定义该Person实体关联的Address实体@OneToOne(targetEntity=Address.class , mappedBy="person")private Address address;// id的setter和getter方法public void setId(Integer id){this.id = id;}public Integer getId(){return this.id;}// name的setter和getter方法public void setName(String name){this.name = name;}public String getName(){return this.name;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// address的setter和getter方法public void setAddress(Address address){this.address = address;}public Address getAddress(){return this.address;}
}

下面是Address的类。

@Entity
@Table(name="address_inf")
public class Address
{// 标识属性@Id @Column(name="address_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private int addressId;// 定义地址详细信息的成员变量private String addressDetail;// 定义该Address实体关联的Person实体@OneToOne(targetEntity=Person.class)// 用于映射person_id外键列,参照person_inf表的person_id列// 指定了unique=true表明是1-1关联@JoinColumn(name="person_id" , referencedColumnName="person_id", unique=true)private Person person;// 无参数的构造器public Address(){}// 初始化全部成员变量的构造器public Address(String addressDetail){this.addressDetail = addressDetail;}// addressId的setter和getter方法public void setAddressId(int addressId){this.addressId = addressId;}public int getAddressId(){return this.addressId;}// addressDetail的setter和getter方法public void setAddressDetail(String addressDetail){this.addressDetail = addressDetail;}public String getAddressDetail(){return this.addressDetail;}// person的setter和getter方法public void setPerson(Person person){this.person = person;}public Person getPerson(){return this.person;}
}

执行如下的类来保存两个对象。

public class PersonManager
{public static void main(String[] args){PersonManager mgr = new PersonManager();mgr.testPerson();HibernateUtil.sessionFactory.close();}private void testPerson(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();// 创建一个瞬态的Person对象Person p = new Person();// 设置Person的name为owen字符串p.setName("owen");p.setAge(21);// 创建一个瞬态的Address对象Address a = new Address("广州天河");// 由于Person实体使用@OneToOne注解时指定了mappedBy属性// 因此Person实体不能用于控制关联关系,只能由Address实体控制关联关系a.setPerson(p);
//      p.setAddress(a);// 先持久化Person对象(对应为插入主表记录)session.save(p);// 再持久化Address对象(对应为插入从表记录)session.persist(a);tx.commit();HibernateUtil.closeSession();}
}

执行结果如下:

2.  有连接表的双向1-1关联

采用连接表的双向1-1关联是相当罕见的情形,映射相当复杂,数据代表模型烦琐。通常不推荐使用。下面是Person的实体。

 @Entity
@Table(name="person_inf")
public class Person
{// 标识属性@Id @Column(name="person_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String name;private int age;// 定义该Person实体关联的Address实体@OneToOne(targetEntity=Address.class)// 映射底层连接表,表名为person_address@JoinTable(name="person_address",// 映射连接表的外键列,增加unique=true表明是1-1关联joinColumns=@JoinColumn(name="person_id", referencedColumnName="person_id" , unique=true),// 映射连接表的外键列,增加unique=true表明是1-1关联inverseJoinColumns=@JoinColumn(name="address_id", referencedColumnName="address_id", unique=true))private Address address;// id的setter和getter方法public void setId(Integer id){this.id = id;}public Integer getId(){return this.id;}// name的setter和getter方法public void setName(String name){this.name = name;}public String getName(){return this.name;}// age的setter和getter方法public void setAge(int age){this.age = age;}public int getAge(){return this.age;}// address的setter和getter方法public void setAddress(Address address){this.address = address;}public Address getAddress(){return this.address;}
}

下面是Address的实体。

@Entity
@Table(name="address_inf")
public class Address
{// 标识属性@Id @Column(name="address_id")@GeneratedValue(strategy=GenerationType.IDENTITY)private int addressId;// 定义地址详细信息的成员变量private String addressDetail;// 定义该Address实体关联的Person实体@OneToOne(targetEntity=Person.class)// 映射底层连接表,表名为person_address@JoinTable(name="person_address",// 映射连接表的外键列,增加unique=true表明是1-1关联joinColumns=@JoinColumn(name="address_id", referencedColumnName="address_id", unique=true),// 映射连接表的外键列,增加unique=true表明是1-1关联inverseJoinColumns=@JoinColumn(name="person_id", referencedColumnName="person_id" , unique=true))private Person person;// 无参数的构造器public Address(){}// 初始化全部成员变量的构造器public Address(String addressDetail){this.addressDetail = addressDetail;}// addressId的setter和getter方法public void setAddressId(int addressId){this.addressId = addressId;}public int getAddressId(){return this.addressId;}// addressDetail的setter和getter方法public void setAddressDetail(String addressDetail){this.addressDetail = addressDetail;}public String getAddressDetail(){return this.addressDetail;}// person的setter和getter方法public void setPerson(Person person){this.person = person;}public Person getPerson(){return this.person;}
}

保存两个对象的执行方法如下。

 public class PersonManager
{public static void main(String[] args){PersonManager mgr = new PersonManager();mgr.testPerson();HibernateUtil.sessionFactory.close();}private void testPerson(){Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction();// 创建一个瞬态的Person对象Person p = new Person();// 设置Person的name为owen字符串p.setName("owen");p.setAge(21);// 创建一个瞬态的Address对象Address a = new Address("广州天河");// 设置Person和Address之间的关联关系
//      p.setAddress(a);a.setPerson(p);// 持久化Address对象session.persist(a);// 持久化Person对象session.save(p);tx.commit();HibernateUtil.closeSession();}
}

执行结果如下:

Hibernate的双向1-1关联(七)相关推荐

  1. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...

  2. Hibernate 一对一外键单向关联

    [align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align] 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向 ...

  3. hibernate one2one 唯一外键关联(双向关联)

    hibernate的一对一唯一外键关联映射(双向关联 Person <------->IdCard) 一对一唯一外键关联采用<one - to -one>标签映射,必须指定标签 ...

  4. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  5. Hibernate实战——双向N-N关联

    一 配置文件 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 ...

  6. hibernate 双向一对多 关联在多端维护

    作者:xyzroundo 如果在"一"一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多  的一端来维护关联关系

  7. Hibernate学习之一对多关联

    注意事项: 1.单向一对多  只需在"一"放进行配置 2.双向一对多   需要在关联双方都加以配置,而且需要在一的一方设置inverse=true 首先是实体类: TAddress ...

  8. hibernate一对一外键单向关联

    与上篇相对应,还是client和address是一对一的外键关联关系,address表中的主键ID与client表中的外键CLIENTADDRESSID构成一对一外键关联关系. 表结构和sql语句就不 ...

  9. 双向@OneToMany / @ManyToOne关联

    编程的目标之一是代表现实世界中的模型. 通常,应用程序需要对实体之间的某些关系进行建模. 在上一篇有关Hibernate关联的文章中,我描述了建立"一对一"关系的规则. 今天,我将 ...

  10. Hibernate一对一主键单向关联

    2019独角兽企业重金招聘Python工程师标准>>> 模型user,address address对user进行外键关联,意思就是address的主键是由user的主键关联生成的, ...

最新文章

  1. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
  2. 怎么安装python的包_python下如何安装.whl包?
  3. 【Python】Jupyter Notebook这款「骚气满满」的小工具,简直太爱了!
  4. python获取计算机信息系统数据罪_工作心得:破坏计算机信息系统罪与非法获取计算机信息系统数据罪的区分...
  5. 当精准广告遇到大数据
  6. C# Bitmap类型与Byte[]类型相互转化
  7. getInvokeArg()和setParam配合使用
  8. 删除.svn文件夹方法(转)
  9. linux安装g++编译器_Ubuntu Desktop下配置Rosetta安装教程
  10. 着陆页UI KitWanted,可参考的模板
  11. c语言实现单链表数据结构,数据结构与算法-C语言实现单链表,以及单链表的常用方法...
  12. xms和xmx为什么要相同_为什么开料机价格相差这么多?秘密在这里,你知道吗?...
  13. DBN-RBM TensorFlow实现
  14. 2022年中式烹调师(技师)考试题库及答案
  15. EMC测试项目——辐射骚扰
  16. Qt 中使用librdkafka librdkafka++ 创建消费者
  17. 情商和逆商比智商更重要
  18. PVM振动测量2018~2020调研整理
  19. 微信支付来了,微信App来了,微信能力来了
  20. 关于图的广度优先搜索—————洛谷1332

热门文章

  1. cookie Web Storage API
  2. 25年前的预言(转贴一篇,事实胜于雄辩)
  3. mysql-5.7.19-winx64_mysql5.7.19 winx64安装配置方法图文教程(win10)
  4. CocosCreator2.3.1按钮节点防止多次连续点击
  5. vs2017+配置工程的编译路径(输出目录和中间目录)
  6. 游戏筑基开发之初识指针
  7. Docker详解(十六)——Docker私有化仓库创建
  8. LAMP架构调优(七)——Apache Prefork模式调优
  9. kali Linux 没有ip解决办法
  10. cisco 的网络地址转换技术(NAT)