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记录方便为了自行脑补~~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落花落雨不落叶

canvas画简单电路图

86111
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5617
来自专栏杨龙飞前端

scrollto 到指定位置

2964
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39110
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3685
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

5988
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3308
来自专栏魂祭心

原 canvas绘制clock

5154
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4405
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007

扫码关注云+社区