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/entity4/People.hbm.xml"></mapping>
<mapping resource="com/great/entity4/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.entity4">
<!-- 配置实体类与数据库表的映射关系 -->
<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.entity4">
<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>
</class>
</hibernate-mapping>
People.java
package com.great.entity4;
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.entity4;
public class IdCard {
// 一对一外键单向关联
private int card_id;
private String cardCode;
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;
}
}
TestOneToOneForeignUn.java(测试类)
package com.great.test;
import org.hibernate.Transaction;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.great.entity4.IdCard;
import com.great.entity4.People;
public class TestOneToOneForeignUnidirectional {
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();
}
// 只能通过people进行查询
@Test
public void testOneToOneSelect1() {
People people1 = (People) session.get(People.class, 1);
System.out.println("身份证号码:" + people1.getIdCard().getCardCode());
System.out.println("姓名是:" + people1.getpName());
}
// insert数据,只能通过保存people来插入数据
@Test
public void testOneToOneSave1() {
Transaction ts = session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardCode("4567891234566");
People people = new People();
people.setpName("张起灵");
people.setIdCard(idCard);
session.save(people);
ts.commit();
}
// delete数据,只能通过people删除了,级联删除inCard。
@Test
public void testOneToOneDelete1() {
Transaction ts = session.beginTransaction();
People people = (People) session.get(People.class, 5);
session.delete(people);
ts.commit();
}
// 更新数据1,通过改变people进行数据更新,不能通过改变idCard进行数据更新
@Test
public void testOneToOneUpdate1() {
Transaction ts = session.beginTransaction();
People people = (People) session.get(People.class, 5);
people.setpName("张起灵1");
people.getIdCard().setCardCode("511381199612120254");
/*
* session.update(people);
* update和saveOrUpdate的区别在于后者在数据库中不存在此对象的情况下插入,所以效率低。
*/
session.saveOrUpdate(people);
ts.commit();
}
// 更新数据2,两方都更新,但是没必要,如果这样就失去了关联的意思并且增加了复杂度。
@Test
public void testOneToOneUpdate2() {
Transaction ts = session.beginTransaction();
People people = (People) session.get(People.class, 5);
IdCard idCard = (IdCard) session.get(IdCard.class, 5);
people.setpName("小哥");
idCard.setCardCode("311381199612120254");
session.update(people);
session.update(idCard);
ts.commit();
}
}
数据库:
people1表
三个字段id pName card_id(外键)
idcard1表
两个字段id cardCode
注意:在people表的card_id上建立外键关系。
hibernate一对一外键单向关联的更多相关文章
- hibernate一对一外键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate,一对一外键单向 记录。Timestamp 的一个坑。
首先是2张表 表A: 表B: 其中表B中的FormBaseId对应表A中的SubjectID. 数据库中没有设置外键关系. 下面是2个对应的实体 package questionnaire.model ...
- 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 ...
- Hibernate5.2之一对一外键关联(五)
Hibernate5.2之一对一外键关联(五) 一.简介 上篇文章中笔者介绍了Hibernate关联关 ...
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...
随机推荐
- 防御XSS攻击-encode用户输入内容的重要性
一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- nodejs中获取时间戳、时间差
Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...
- nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证
http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...
- 基于SignalR实现B/S系统对windows服务运行状态的监测
通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...
- vmware上网的方式
vmware上网设置 vmware虚拟机上网设置 我的一些心得,如下: 如何使vmware虚拟机中的操作系统能够上网? 第一种情况: 主机使用PPPOE拨号上网 方法一:NAT方式 1.先关闭虚拟机中 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- openresty 前端开发入门四之Redis篇
这章主要演示怎么通过lua连接redis,并根据用户输入的key从redis获取value,并返回给用户 操作redis主要用到了lua-resty-redis库,代码可以在github上找得到 而且 ...