Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
Posted --->别先生<---
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate之关联关系映射(一对一主键映射和一对一外键映射)相关的知识,希望对你有一定的参考价值。
1:Hibernate的关联关系映射的一对一外键映射:
1.1:第一首先引包,省略
1.2:第二创建实体类:
这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键。
创建User.java:
用户和身份证一对一的关联关系映射
private IdCart idCart;
IdCart.java:
身份证和用户,一对一的关系
private User user;
1 package com.bie.bean; 2 /** 3 * @author BieHongLi 4 * @version 创建时间:2017年3月22日 下午2:06:35 5 * 用户的实体类 6 */ 7 public class User { 8 9 private int id; 10 private String name; 11 12 //用户和身份证一对一的关联关系映射 13 private IdCart idCart; 14 15 public int getId() { 16 return id; 17 } 18 19 public void setId(int id) { 20 this.id = id; 21 } 22 23 public String getName() { 24 return name; 25 } 26 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 public IdCart getIdCart() { 32 return idCart; 33 } 34 35 public void setIdCart(IdCart idCart) { 36 this.idCart = idCart; 37 } 38 39 @Override 40 public String toString() { 41 return "User [id=" + id + ", name=" + name + ", idCart=" + idCart + "]"; 42 } 43 44 }
1 package com.bie.bean; 2 /** 3 * @author BieHongLi 4 * @version 创建时间:2017年3月22日 下午2:07:09 5 * 用户身份证信息的实体类 6 */ 7 public class IdCart { 8 9 private String cartNum;//身份证号,主键,对象唯一标识 10 private String place; 11 12 //身份证和用户,一对一的关系 13 private User user; 14 15 public String getCartNum() { 16 return cartNum; 17 } 18 19 public void setCartNum(String cartNum) { 20 this.cartNum = cartNum; 21 } 22 23 public String getPlace() { 24 return place; 25 } 26 27 public void setPlace(String place) { 28 this.place = place; 29 } 30 31 public User getUser() { 32 return user; 33 } 34 35 public void setUser(User user) { 36 this.user = user; 37 } 38 39 @Override 40 public String toString() { 41 return "IdCart [cartNum=" + cartNum + ", place=" + place + ", user=" + user + "]"; 42 } 43 44 }
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>
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.bie.bean"> 6 <class name="User" table="user2"> 7 <!-- 主键映射 --> 8 <id name="id" column="id"> 9 <generator class="native"></generator> 10 </id> 11 12 <!-- 非主键映射 --> 13 <property name="name" column="name" type="string" length="20"></property> 14 15 16 <!-- 其他字段映射 --> 17 <!-- 18 一对一映射,没有主键 19 --> 20 <one-to-one name="idCart" class="IdCart"></one-to-one> 21 22 </class> 23 24 </hibernate-mapping> 25 26
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.bie.bean"> 6 <class name="IdCart" table="idCart"> 7 <!-- 主键映射 --> 8 <id name="cartNum" column="cartNum"> 9 <!-- <generator class="native"></generator> --> 10 <!-- 身份证信息自己手动设置更加人性化哦 --> 11 <generator class="assigned"></generator> 12 </id> 13 14 <!-- 非主键映射 --> 15 <property name="place" column="place" type="string" length="20"></property> 16 17 <!-- 其他字段映射 --> 18 <!-- 19 (1)一对一映射,有外键方 20 (2)特殊的多对一映射,多了一个外键,设置主键唯一性 21 (3)cascade="save-update"级联保存 22 (4)用户表的主键做身份证信息的外键 23 (5)unique="true"给外键字段添加唯一约束 24 --> 25 <many-to-one cascade="save-update" unique="true" name="user" column="userId" class="User"></many-to-one> 26 27 </class> 28 </hibernate-mapping>
1.4:最后就可以配置Hibernate.cfg.xml配置了。
1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 4 5 <hibernate-configuration> 6 <!-- 一个session-factory节点代表一个数据库 --> 7 <session-factory> 8 <!-- 第一部分:数据库连接配置 --> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.url">jdbc:mysql:///test</property> 11 <property name="hibernate.connection.username">root</property> 12 <property name="hibernate.connection.password">123456</property> 13 14 <!-- 第二部分:其他相关配置 --> 15 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 16 <property name="hibernate.show_sql">true</property> 17 <!-- <property name="hibernate.format_sql">true</property> --> 18 <property name="hibernate.hbm2ddl.auto">create</property> 19 <!-- 20 1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表 21 #hibernate.hbm2ddl.auto create-drop 22 23 2:每次都重新建表,如果已经存在就先删除再创建 24 #hibernate.hbm2ddl.auto create 25 26 3:如果表不存在就创建,表存在就不创建 27 #hibernate.hbm2ddl.auto update 28 29 4:生成环境时候执行验证,当映射文件的内容与数据库表结构不一样的时候就报错 30 #hibernate.hbm2ddl.auto validate 31 --> 32 33 <!-- 第三部分,加载映射文件 --> 34 <!-- <mapping resource="com/bie/po/User.hbm.xml"/> --> 35 36 37 <!-- 第三部分,加载映射文件,一对一主键和外键的映射的练习 --> 38 <mapping resource="com/bie/bean/User.hbm.xml"/> 39 <mapping resource="com/bie/bean/IdCart.hbm.xml"/> 40 41 </session-factory> 42 </hibernate-configuration> 43 44 45
1.5:最后测试,既可以完成对一对一外键映射的使用和学习:
1 package com.bie.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.junit.Test; 7 8 import com.bie.bean.IdCart; 9 import com.bie.bean.User; 10 11 /** 12 * @author BieHongLi 13 * @version 创建时间:2017年3月22日 下午2:51:34 14 * 15 */ 16 public class One2One { 17 18 private static SessionFactory sf = null; 19 static{ 20 sf = new Configuration().configure().buildSessionFactory(); 21 } 22 23 @Test 24 public void test(){ 25 Session session = sf.openSession(); 26 session.beginTransaction(); 27 28 //用户信息 29 User user = new User(); 30 user.setName("张三三"); 31 32 //身份证信息 33 IdCart idCart = new IdCart(); 34 idCart.setCartNum("41072519930416****"); 35 idCart.setPlace("深圳市"); 36 37 //设置用户信息和身份证信息的关系 38 idCart.setUser(user); 39 40 //如果设置级联操作,只用保存身份证信息即可 41 session.save(idCart); 42 43 session.getTransaction().commit(); 44 session.close(); 45 } 46 }
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>
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.bie.domain"> 6 <class name="IdCart" table="idCart"> 7 <!-- 主键映射 --> 8 <id name="id" column="id"> 9 <!-- 10 id节点指定的是主键映射,即id是主键 11 主键生成方式:foreign即把别的表的主键作为当前表的主键, 12 property(关键字,不能修改)指定引用的对象==》对象的全名com.bie.domain.User==》 13 对象映射文件com.bie.domain.xml==》表table(id) 14 --> 15 <generator class="foreign"> 16 <param name="property">user</param> 17 </generator> 18 </id> 19 20 <property name="cartNum" column="cartNum" type="string" length="20"></property> 21 <!-- 非主键映射 --> 22 <property name="place" column="place" type="string" length="20"></property> 23 24 <!-- 其他字段映射 --> 25 <!-- 26 (1)一对一映射,有外键方 27 (2)用户表的主键做身份证表的主键 28 (3)constrained="true"设置外键 29 --> 30 <one-to-one name="user" constrained="true" class="User"></one-to-one> 31 32 </class> 33 </hibernate-mapping>
Hibernate的关联关系的映射搞清楚如何映射会使用即可,这里LZ记录方便为了自行脑补~~~
以上是关于Hibernate之关联关系映射(一对一主键映射和一对一外键映射)的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate—— 联合主键 一对一关联关系映射(xml和注解) 和 领域驱动设计
Hibernate学习———— hibernate一对一关系映射详解
Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联