hibernate一对一外键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接。
本系列将介绍Hibernate中主要的几种关联映射
Hibernate一对一主键单向关联
Hibernate一对一主键双向关联
Hibernate一对一外键单向关联
Hibernate一对一外键双向关联
Hibernate多对一单向关联
Hibernate多对一双向关联
Hibernate多对多关联
代码都写有注释,主要包括(核心配置文件,实体映射文件,实体类,测试类,数据库)主要操作有增删改查。
本篇主要介绍Hibernate一对一外键双向关联:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置数据库连接驱动类 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 配置数据库连接字符串 --> <property name="connection.url"><![CDATA[jdbc:mysql://localhost:3306/test111?useUnicode=true&characterEncoding=utf8]]></property> <!-- 配置数据库连接用户名 --> <property name="connection.username">root</property> <!-- 配置数据库连接密码 --> <property name="connection.password">123456</property> <!-- 配置数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置数据库表生成策略 --> <!--<property name="hibernate.hbm2ddl.auto">update</property> --> <!-- 配置是否打印显示SQL语句 --> <property name="show_sql">true</property> <!-- 配置是否格式化显示SQL语句 --> <property name="format_sql">true</property> <!-- 配置hibernate是否自动提交事务 --> <!--<property name="hibernate.connection.autocommit">true</property> --> <!-- 配置实体类对应的映射文件 -->
<!-- 一对一双向外键关联 --> <mapping resource="com/great/entity5/People.hbm.xml"></mapping> <mapping resource="com/great/entity5/IdCard.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
People.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.great.entity5"> <!-- 配置实体类与数据库表的映射关系 --> <class name="People" table="people1"> <!-- 配置主键映射关系 --> <id name="id" column="id" type="int"> <!-- 配置主键生成策略 这个主键生成策略并没有什么影响 --> <generator class="native"> </generator> </id> <!-- 配置属性和表字段映射关系 一对外键一双向关联 --> <property name="pName" column="pName" type="string"></property> <many-to-one name="idCard" unique="true" cascade="all"> <column name="card_id"></column> </many-to-one> </class> </hibernate-mapping>
IdCard.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.great.entity5"> <class name="IdCard" table="idcard1"> <id name="card_id" column="id" type="int"> <generator class="identity"> </generator> </id> <!-- 配置属性和表字段映射关系 一对一外键双向关联 --> <property name="cardCode" column="cardCode" type="string"></property> <one-to-one name="people" class="com.great.entity5.People" cascade="all" property-ref="idCard" /> </class> </hibernate-mapping>
People.java
package com.great.entity5; public class People { // 一对一外键双向关联 private int id; private String pName; private IdCard idCard; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getpName() { return pName; } public void setpName(String pName) { this.pName = pName; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } }
IdCard.java
package com.great.entity5; public class IdCard { // 一对一外键双向关联 private int card_id; private String cardCode; private People people; public int getCard_id() { return card_id; } public void setCard_id(int card_id) { this.card_id = card_id; } public String getCardCode() { return CardCode; } public void setCardCode(String cardCode) { CardCode = cardCode; } public People getPeople() { return people; } public void setPeople(People people) { this.people = people; } }
TestOneToOneForeignBoth.java(测试类)
package com.great.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.great.entity5.IdCard; import com.great.entity5.People; public class TestOneToOneForeignBoth { static Session session; // 一对一外键双向关联 @BeforeClass public static void setUpBeforeClass() throws Exception { // 加载hibernate主配置文件 Configuration cfg = new Configuration().configure(); // 构建session工厂 SessionFactory sf = cfg.buildSessionFactory(); // 打开session session = sf.openSession(); } @AfterClass public static void tearDownAfterClass() throws Exception { // 关闭session,释放资源 session.close(); } // select1,通过people @Test public void testOneToOneSelect1() { People people = (People) session.get(People.class, 1); System.out.println("身份证号码:" + people.getIdCard().getCardCode()); System.out.println("姓名是:" + people.getpName()); } // select2,通过idCard @Test public void testOneToOneSelect2() { IdCard idCard = (IdCard) session.get(IdCard.class, 1); System.out.println("身份证号码:" + idCard.getCardCode()); System.out.println("姓名是:" + idCard.getPeople().getpName()); } // insert1数据,通过保存people来插入数据 @Test public void testOneToOneSave1() { Transaction ts = session.beginTransaction(); IdCard idCard = new IdCard(); idCard.setCardCode("124567891234566"); People people = new People(); people.setpName("张起灵2"); idCard.setPeople(people);// 可加可不加 people.setIdCard(idCard); session.save(people); ts.commit(); } // insert2数据,通过保存inCard来插入数据 @Test public void testOneToOneSave2() { Transaction ts = session.beginTransaction(); IdCard idCard = new IdCard(); idCard.setCardCode("124567891234566"); People people = new People(); people.setpName("张起灵2"); people.setIdCard(idCard);// 必须加,否则失败 idCard.setPeople(people); session.save(idCard); ts.commit(); } // delete1数据,删除people,级联删除inCard。发出两条查询两条删除语句 @Test public void testOneToOneDelete1() { Transaction ts = session.beginTransaction(); People people = (People) session.get(People.class, 12); session.delete(people); ts.commit(); } /* * delete2数据,通过删除idCard,级联删除people. * delete数据。发出两条查询两条删除语句,也是先删除people再删除idCard */ @Test public void testOneToOneDelete2() { Transaction ts = session.beginTransaction(); IdCard idCard = (IdCard) session.get(IdCard.class, 14); session.delete(idCard); ts.commit(); } // 更新数据1,通过people进行更新 @Test public void testOneToOneUpdate1() { Transaction ts = session.beginTransaction(); People people = (People) session.get(People.class, 11); people.setpName("张起灵1"); people.getIdCard().setCardCode("511381199612120254"); /* * session.update(people); * update和saveOrUpdate的区别在于后者在数据库中不存在此对象的情况下插入,所以效率低。 */ session.saveOrUpdate(people); ts.commit(); } // 更新数据2,通过idCard进行更新 @Test public void testOneToOneUpdate2() { Transaction ts = session.beginTransaction(); IdCard idCard = (IdCard) session.get(IdCard.class, 8); idCard.getPeople().setpName("张起灵3"); idCard.setCardCode("311381199612120254"); session.update(idCard); ts.commit(); } }
数据库:
people1表
三个字段id pName card_id(外键)
idcard1表
两个字段id cardCode
注意:在people表的card_id上建立外键关系。
hibernate一对一外键双向关联的更多相关文章
- Hibernate一对一外键双向关联(Annotation配置)
如上图所示:一个学生有一个学生证号,一个学生证号对应一名学生.在Hibernate中怎么用Annotation来实现呢? 学生类,主键是id:学生证的主键也是Id: Student.java pack ...
- hibernate一对一外键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate一对一外键映射
Hibernate 一对一外键映射 ------------------------------ ----- ...
- Hibernate,一对一外键单向 记录。Timestamp 的一个坑。
首先是2张表 表A: 表B: 其中表B中的FormBaseId对应表A中的SubjectID. 数据库中没有设置外键关系. 下面是2个对应的实体 package questionnaire.model ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- ORM框架Hibernate (四) 一对一单向、双向关联映射
简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...
- hibernate之关于一对一单向,双向关联映射
[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
随机推荐
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...
- web api接口同步和异步的问题
一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...
- Windows下Visual studio 2013 编译 Audacity
编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity. ...
- 【深入Java虚拟机】之四:类加载机制
类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验 ...
- SpringMVC+Shiro权限管理【转】
1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...
- web 前端(轮番插件)
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...
- linux-centos在VM中的网络配置
1.自动获取IP地址 虚拟机使用桥接模式,相当于连接到物理机的网络里,物理机网络有DHCP服务器自动分配IP地址. #dhclient 自动获取ip地址命令 #ifconfig 查询系统里网卡信息,i ...
- nginx常用代理配置
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置. 1. 最简反向代理配置 在http节点下,使用upstream配置服务地址,使用ser ...