Hibernate的双向1-1关联(七)
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关联(七)相关推荐
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...
- Hibernate 一对一外键单向关联
[align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align] 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向 ...
- hibernate one2one 唯一外键关联(双向关联)
hibernate的一对一唯一外键关联映射(双向关联 Person <------->IdCard) 一对一唯一外键关联采用<one - to -one>标签映射,必须指定标签 ...
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式
首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...
- Hibernate实战——双向N-N关联
一 配置文件 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 ...
- hibernate 双向一对多 关联在多端维护
作者:xyzroundo 如果在"一"一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多 的一端来维护关联关系
- Hibernate学习之一对多关联
注意事项: 1.单向一对多 只需在"一"放进行配置 2.双向一对多 需要在关联双方都加以配置,而且需要在一的一方设置inverse=true 首先是实体类: TAddress ...
- hibernate一对一外键单向关联
与上篇相对应,还是client和address是一对一的外键关联关系,address表中的主键ID与client表中的外键CLIENTADDRESSID构成一对一外键关联关系. 表结构和sql语句就不 ...
- 双向@OneToMany / @ManyToOne关联
编程的目标之一是代表现实世界中的模型. 通常,应用程序需要对实体之间的某些关系进行建模. 在上一篇有关Hibernate关联的文章中,我描述了建立"一对一"关系的规则. 今天,我将 ...
- Hibernate一对一主键单向关联
2019独角兽企业重金招聘Python工程师标准>>> 模型user,address address对user进行外键关联,意思就是address的主键是由user的主键关联生成的, ...
最新文章
- 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证
- 怎么安装python的包_python下如何安装.whl包?
- 【Python】Jupyter Notebook这款「骚气满满」的小工具,简直太爱了!
- python获取计算机信息系统数据罪_工作心得:破坏计算机信息系统罪与非法获取计算机信息系统数据罪的区分...
- 当精准广告遇到大数据
- C# Bitmap类型与Byte[]类型相互转化
- getInvokeArg()和setParam配合使用
- 删除.svn文件夹方法(转)
- linux安装g++编译器_Ubuntu Desktop下配置Rosetta安装教程
- 着陆页UI KitWanted,可参考的模板
- c语言实现单链表数据结构,数据结构与算法-C语言实现单链表,以及单链表的常用方法...
- xms和xmx为什么要相同_为什么开料机价格相差这么多?秘密在这里,你知道吗?...
- DBN-RBM TensorFlow实现
- 2022年中式烹调师(技师)考试题库及答案
- EMC测试项目——辐射骚扰
- Qt 中使用librdkafka librdkafka++ 创建消费者
- 情商和逆商比智商更重要
- PVM振动测量2018~2020调研整理
- 微信支付来了,微信App来了,微信能力来了
- 关于图的广度优先搜索—————洛谷1332
热门文章
- cookie Web Storage API
- 25年前的预言(转贴一篇,事实胜于雄辩)
- mysql-5.7.19-winx64_mysql5.7.19 winx64安装配置方法图文教程(win10)
- CocosCreator2.3.1按钮节点防止多次连续点击
- vs2017+配置工程的编译路径(输出目录和中间目录)
- 游戏筑基开发之初识指针
- Docker详解(十六)——Docker私有化仓库创建
- LAMP架构调优(七)——Apache Prefork模式调优
- kali Linux 没有ip解决办法
- cisco 的网络地址转换技术(NAT)