Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射:
1.1:第一首先引包,省略
1.2:第二创建实体类:
这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键。
创建User.java:
用户和身份证一对一的关联关系映射
private IdCart idCart;
IdCart.java:
身份证和用户,一对一的关系
private User user;
package com.bie.bean;
/**
* @author BieHongLi
* @version 创建时间:2017年3月22日 下午2:06:35
* 用户的实体类
*/
public class User { private int id;
private String name; //用户和身份证一对一的关联关系映射
private IdCart idCart; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public IdCart getIdCart() {
return idCart;
} public void setIdCart(IdCart idCart) {
this.idCart = idCart;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", idCart=" + idCart + "]";
} }
package com.bie.bean;
/**
* @author BieHongLi
* @version 创建时间:2017年3月22日 下午2:07:09
* 用户身份证信息的实体类
*/
public class IdCart { private String cartNum;//身份证号,主键,对象唯一标识
private String place; //身份证和用户,一对一的关系
private User user; public String getCartNum() {
return cartNum;
} public void setCartNum(String cartNum) {
this.cartNum = cartNum;
} public String getPlace() {
return place;
} public void setPlace(String place) {
this.place = place;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String toString() {
return "IdCart [cartNum=" + cartNum + ", place=" + place + ", user=" + user + "]";
} }
1.3:创建好实体类,就可以开始配置映射关系了:
User.hbm.xml:
<one-to-one name="idCart" class="IdCart"></one-to-one>
IdCart.hbm.xml:
<!--
(1)一对一映射,有外键方
(2)特殊的多对一映射,多了一个外键,设置主键唯一性
(3)cascade="save-update"级联保存
(4)用户表的主键做身份证信息的外键
(5)unique="true"给外键字段添加唯一约束
-->
<many-to-one cascade="save-update" unique="true" name="user" column="userId" class="User">
</many-to-one>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bie.bean">
<class name="User" table="user2">
<!-- 主键映射 -->
<id name="id" column="id">
<generator class="native"></generator>
</id> <!-- 非主键映射 -->
<property name="name" column="name" type="string" length="20"></property> <!-- 其他字段映射 -->
<!--
一对一映射,没有主键
-->
<one-to-one name="idCart" class="IdCart"></one-to-one> </class> </hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bie.bean">
<class name="IdCart" table="idCart">
<!-- 主键映射 -->
<id name="cartNum" column="cartNum">
<!-- <generator class="native"></generator> -->
<!-- 身份证信息自己手动设置更加人性化哦 -->
<generator class="assigned"></generator>
</id> <!-- 非主键映射 -->
<property name="place" column="place" type="string" length="20"></property> <!-- 其他字段映射 -->
<!--
(1)一对一映射,有外键方
(2)特殊的多对一映射,多了一个外键,设置主键唯一性
(3)cascade="save-update"级联保存
(4)用户表的主键做身份证信息的外键
(5)unique="true"给外键字段添加唯一约束
-->
<many-to-one cascade="save-update" unique="true" name="user" column="userId" class="User"></many-to-one> </class>
</hibernate-mapping>
1.4:最后就可以配置Hibernate.cfg.xml配置了。
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<!-- 一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 第一部分:数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property> <!-- 第二部分:其他相关配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<!-- <property name="hibernate.format_sql">true</property> -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!--
1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表
#hibernate.hbm2ddl.auto create-drop 2:每次都重新建表,如果已经存在就先删除再创建
#hibernate.hbm2ddl.auto create 3:如果表不存在就创建,表存在就不创建
#hibernate.hbm2ddl.auto update 4:生成环境时候执行验证,当映射文件的内容与数据库表结构不一样的时候就报错
#hibernate.hbm2ddl.auto validate
--> <!-- 第三部分,加载映射文件 -->
<!-- <mapping resource="com/bie/po/User.hbm.xml"/> --> <!-- 第三部分,加载映射文件,一对一主键和外键的映射的练习 -->
<mapping resource="com/bie/bean/User.hbm.xml"/>
<mapping resource="com/bie/bean/IdCart.hbm.xml"/> </session-factory>
</hibernate-configuration>
1.5:最后测试,既可以完成对一对一外键映射的使用和学习:
package com.bie.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.bie.bean.IdCart;
import com.bie.bean.User; /**
* @author BieHongLi
* @version 创建时间:2017年3月22日 下午2:51:34
*
*/
public class One2One { private static SessionFactory sf = null;
static{
sf = new Configuration().configure().buildSessionFactory();
} @Test
public void test(){
Session session = sf.openSession();
session.beginTransaction(); //用户信息
User user = new User();
user.setName("张三三"); //身份证信息
IdCart idCart = new IdCart();
idCart.setCartNum("41072519930416****");
idCart.setPlace("深圳市"); //设置用户信息和身份证信息的关系
idCart.setUser(user); //如果设置级联操作,只用保存身份证信息即可
session.save(idCart); session.getTransaction().commit();
session.close();
}
}
2:Hibernate的关联关系映射的一对一主键映射:
2.1:第一步引包省略
2.2:第二步,创建实体类,和上面的实体类的区别就是在身份证实体类表里面加了一个成员变量
private int id;//用户表的主键做身份证表的主键
2.3:第三步配置映射文件,这里修改的主要是身份证的映射文件,修改如下所示:
User.hbm.xml:主要是包的改动
<hibernate-mapping package="com.bie.domain"></hibernate-mapping>
IdCart.hbm.xml:这个改动略大哦
<!-- 主键映射 -->
<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" constrained="true" class="User"></one-to-one>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bie.domain">
<class name="IdCart" table="idCart">
<!-- 主键映射 -->
<id name="id" column="id">
<!--
id节点指定的是主键映射,即id是主键
主键生成方式:foreign即把别的表的主键作为当前表的主键,
property(关键字,不能修改)指定引用的对象==》对象的全名com.bie.domain.User==》
对象映射文件com.bie.domain.xml==》表table(id)
-->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id> <property name="cartNum" column="cartNum" type="string" length="20"></property>
<!-- 非主键映射 -->
<property name="place" column="place" type="string" length="20"></property> <!-- 其他字段映射 -->
<!--
(1)一对一映射,有外键方
(2)用户表的主键做身份证表的主键
(3)constrained="true"设置外键
-->
<one-to-one name="user" constrained="true" class="User"></one-to-one> </class>
</hibernate-mapping>
Hibernate的关联关系的映射搞清楚如何映射会使用即可,这里LZ记录方便为了自行脑补~~~
Hibernate之关联关系映射(一对一主键映射和一对一外键映射)的更多相关文章
- EF Code First 主键对应多个外键
这是一位朋友提出的疑问,EF 映射主键可以对应多个外键吗?如果外键设置级联删除会发生什么情况?下面做一个测试,示例实体代码: public class Blog { public Blog() { P ...
- Hibernate 注解多对一 要求在多那边产生一个外键而不会另外产生一个表
在使用hibernate注解的时候,我们映射一对多时,有时候莫名其妙的产生了两张表,其中一张表是A_B,这并不符合数据库中多的一方放置一个外键的原则,那么如何控制只产生一个表呢,请看下面的例子: 多的 ...
- MySQL删除所有表的外键约束、禁用外键约束
转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- (转载)MySQL删除所有表的外键约束、禁用外键约束
其实如果想删除所有表可以直接如下操作: 在navicat中直接选中所有表,然后右键删除表即可,会有提示,一路确定,就会先删掉没有外键的表和字表,只要一路确定,删几批就把表都删完了,并不算太麻烦. 转: ...
- PowerDesigner删除外键关系,而不删除外键列[转] 及编码格式
PowerDesigner删除外键关系,而不删除外键列[转] 数据库 database -> generate database ->format 设置为utf-8 PowerDesi ...
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- 在oracle中查询已知表名的表中所有字段名,每个字段是否是主键,是否是外键,是否为空的sql语句
查询表的所有列及其属性:select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c ...
- SQL中的主键,候选键,外键,主码,外码
1.码=超键:能够唯一标识一条记录的属性或属性集. 标识性:一个数据表的所有记录都具有不同的超键 非空性:不能为空 有些时候也把码称作"键" 2.候选键=候选码:能够唯一标识一条记 ...
- ORA-02266: 表中的唯一/主键被启用的外键引用
http://www.cnblogs.com/cici-new/archive/2013/01/01/2841700.html 需要如下操作 先取消子表外键的外键约束,之后删除父表数据,最后再次启用外 ...
随机推荐
- java 中如何声明线程安全的集合 set, map 和list【转】
线程安全的集合 引用自 http://blog.sina.com.cn/s/blog_508938e10102v1ig.html //make thread-safe list List MyStrL ...
- .NET面试题系列(十三)Lucene底层原理
索引原理 全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹.倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成 ...
- 搭建Linux下Android程序开发环境
从AndroidStudio中文社区下载SDK压缩包,http://dl.google.com/android/android-sdk_r24.2-linux.tgz. 解压到某个目录,比如我的~/p ...
- 20155228 2016-2017-2 《Java程序设计》第7周学习总结
20155228 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda 方法参考的特性,在重用现有的API上扮演了重要的角色.重用现有方法操作,可以避 ...
- 第18月第21日 vue cnpm
1. 首先我们需要下载npm,因为我已经提前安装了node.js,安装包里面集成了npm,然后我们就可以利用npm命令从获取淘宝镜像的cnpm了. 1.打开命令行窗口,输入 npm install - ...
- $Miller Rabin$总结
\(Miller Rabin\)总结: 这是一个很高效的判断质数的方法,可以在用\(O(logn)\) 的复杂度快速判断一个数是否是质数.它运用了费马小定理和二次探测定理这两个筛质数效率极高的方法. ...
- centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′
原文连接: http://blog.csdn.net/jaket5219999/article/details/53512071 系统red hat6.7 也即centos6.7 python3.5. ...
- mysql 原理 ~ sql执行
一 普通sql执行的具体过程1 连接器 管理连接,权限验证2 分析器 词法分析,语法分析 比如 数据表和数据列是否存在, 别名是否有歧义,是否符合标准sql语法等3 优化器检测 执行计划生 ...
- python - class类 (一)
三大编程范式 1.面向过程 2.函数式 3.面向对象 注意 编程范式没有高低之分,只有适用不适用. 面向对象编程: 编程是程序源用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一 ...
- [转]bus error与segment error
在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...