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官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
随机推荐
- 干货分享:让你分分钟学会 JS 闭包
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- Android Fragment 剖析
1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...
- Ubuntu安装redis并配置远程、密码以及开启php扩展
一.前言 redis是当前流行的nosql数据库,很多网站都用它来做缓存,今天我们来安装并配置下redis 二.安装并配置redis 1.安装redis sudo apt-get install re ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- 《徐徐道来话Java》(1):泛型的基本概念
泛型是一种编程范式(Programming Paradigm),是为了效率和重用性产生的.由Alexander Stepanov(C++标准库主要设计师)和David Musser(伦斯勒理工学院CS ...
- 让OMCS支持更多的视频采集设备
有些OMCS用户在他的系统使用了特殊的视频采集卡作为视频源(如AV-878采集卡),虽然这些采集卡可以虚拟为一个摄像头,但有些视频采集卡需要依赖于自带了sdk才能正常地完成视频采集工作.在这种情况下, ...