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/test1?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/entity2/People.hbm.xml"></mapping> <mapping resource="com/great/entity2/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.entity2"> <!-- 配置实体类与数据库表的映射关系 --> <class name="com.great.entity2.People" table="people"> <!-- 配置主键映射关系 --> <id name="id" column="id" type="int"> <!-- 配置主键生成策略 --> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <!-- 配置属性和表字段映射关系 --> <property name="pName" column="pName" type="string"></property> <one-to-one name="idCard" class="com.great.entity2.IdCard" cascade="all"></one-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.entity2"> <class name="IdCard" table="idcard"> <id name="id" column="id" type="int"> <generator class="native"> </generator> </id> <!-- 配置属性和表字段映射关系 --> <property name="cardCode" column="cardCode" type="string"></property> <one-to-one class="com.great.entity2.People" name="people" cascade="all"></one-to-one> </class> </hibernate-mapping>
People.java
package com.great.entity2; 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.entity2; public class IdCard { private int id; private String cardCode; private People people; public int getId() { return id; } public void setId(int id) { this.id = 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; } }
TestOneToOneUniqueBoth.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.entity2.IdCard; import com.great.entity2.People; public class TestOneToOneUniqueBoth { 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查询idcard @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查询people @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插入数据 ,两条insert,【先insert idCard,后insert // people,涉及键的问题,必须顺序的保存数据,而insert语句就是按顺序的,和select,delete,update不一样】 @Test public void testOneToOneSave1() { Transaction ts = session.beginTransaction(); // 设置idcard IdCard idCard = new IdCard(); idCard.setCardCode("411487199505051234"); // 设置people People people = new People(); people.setpName("王胖"); // 互相保存 idCard.setPeople(people); people.setIdCard(idCard); // 保存idcard,必须保存idCard,保存People出错,Hibernate这次首先持久化了people对象 // 由于people表中的id字段建立了外键关系,故持久化失败. session.save(idCard); ts.commit(); } /* * delete1 通过删除idCard删除数据,一条select,两条delete,先delete people,再delete idCard * ,【涉及键的问题,与select有关,所以只能有一种delete的方法】 */ @Test public void testOneToOneDelete1() { Transaction ts = session.beginTransaction(); IdCard idCard = (IdCard) session.get(IdCard.class, 10); session.delete(idCard); ts.commit(); } // delete2 通过删除idCard删除数据, // @Test // public void testOneToOneDelete2() { // Transaction ts = session.beginTransaction(); // People people = (People) session.get(People.class, 8); // session.delete(people); // ts.commit(); // } /* * update1 ,通过idCard更新数据,发出一条select,两条update ,先update people,再update inCard * 【因为要想update idCard,就得update people,不涉及键的问题,只与select有关】 */ @Test public void testOneToOneUpdate1() { Transaction ts = session.beginTransaction(); IdCard idCard = (IdCard) session.get(IdCard.class, 8); idCard.setCardCode("123456789"); idCard.getPeople().setpName("张起灵aaa"); session.update(idCard); ts.commit(); } /* * update2 ,通过people更新数据,发出一条select,两条update ,先update idCard,再update * people【因为要想update people,就得update idCard,不涉及键的问题,只与select有关】 */ @Test public void testOneToOneUpdate2() { Transaction ts = session.beginTransaction(); People people = (People) session.get(People.class, 8); people.setpName("小哥"); people.getIdCard().setCardCode("66666"); session.update(people); ts.commit(); } }
数据库:
people表
两个字段id pName
idcard表
两个字段id cardCode
注意:在people表上建立外键关系。
hibernate一对一主键双向关联的更多相关文章
- hibernate一对一外键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate一对一外键双向关联(Annotation配置)
如上图所示:一个学生有一个学生证号,一个学生证号对应一名学生.在Hibernate中怎么用Annotation来实现呢? 学生类,主键是id:学生证的主键也是Id: Student.java pack ...
- hibernate一对一外键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate一对一主键映射
Hibernate一对一主键映射 ------------------------------ -- ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...
- Hibernate关联映射1:一对一主键关联
2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...
- 010一对一 主键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
随机推荐
- 恢复SQL Server被误删除的数据
恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...
- POCO Controller 你这么厉害,ASP.NET vNext 知道吗?
写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 POJO 与 PO.VO 的区别 POJO 的扩展 POCO VS DTO Controller 是什么? 关于 P ...
- fiddler发送post请求
1.指定为 post 请求,输入 url Content-Type: application/x-www-form-urlencoded;charset=utf-8 request body中的参数格 ...
- 开源一个跨平台运行的服务插件 - TaskCore.MainForm
本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.Main ...
- Spring Enable annotation – writing a custom Enable annotation
原文地址:https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotati ...
- QQ空间动态爬虫
作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...
- 敏捷转型历程 - Sprint3 回顾会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- A/B Testing的简要知识
A/B testing主要用来检测网站或者APP的两个版本中哪一个更好,它的中心思想是把流量一分为二,一份用作experiment group,访问新的版本,另一份用作control group,访问 ...
- 【一起学OpenFoam】02 软件准备
"工欲善其事必先利其器",在利用OpenFoam解决我们的工程问题之前,首先要做的事情是搭建一个OpenFoam运行环境.很遗憾的是,OpenFoam的原生开发系统是Linux,因 ...
- EntityFramework 6 + Mysql 生成POCOs
问题 使用EDMX文件 EF Power Tools参数不正确的解决方法 对于"异常来自 HRESULT:0x80070057 (E_INVALIDARG)",有方法说" ...