码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate 一对一关联查询

时间:2016-06-21 09:14:23      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

  一对一关联,可以分为两种。一种是基于外键的关联,另一种是基于主键的关联。如图

技术分享

 

一、基于外键的方式

  

  User.java

 1 package com.proc.one2one;
 2 
 3 public class User {
 4 
 5     private Integer id;
 6     private String name;
 7     private IdCard card;
 8     public User() {
 9     }
10     public User(String name) {
11         this.name = name;
12     }
13     public Integer getId() {
14         return id;
15     }
16     public void setId(Integer id) {
17         this.id = id;
18     }
19     public String getName() {
20         return name;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public IdCard getCard() {
26         return card;
27     }
28     public void setCard(IdCard card) {
29         this.card = card;
30     }
31     @Override
32     public String toString() {
33         return "User [id=" + id + ", name=" + name + "]";
34     }
35 }

 

  IdCard.java

 1 package com.proc.one2one;
 2 
 3 public class IdCard {
 4 
 5     private Integer id;
 6     private String cardNo;
 7     private User user;
 8     public IdCard(String cardNo) {
 9         this.cardNo = cardNo;
10     }
11     public IdCard() {
12     }
13     public Integer getId() {
14         return id;
15     }
16     public void setId(Integer id) {
17         this.id = id;
18     }
19     public String getCardNo() {
20         return cardNo;
21     }
22     public void setCardNo(String cardNo) {
23         this.cardNo = cardNo;
24     }
25     public User getUser() {
26         return user;
27     }
28     public void setUser(User user) {
29         this.user = user;
30     }
31     @Override
32     public String toString() {
33         return "IdCard [id=" + id + ", cardNo=" + cardNo + "]";
34     }
35     
36 }

  

  User.hbm.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 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.proc.one2one">
 6     <class name="User" table="t_user">
 7         <id name="id" type="int" column="id" >
 8             <generator class="native"></generator>
 9         </id>
10         <property name="name" length="20" not-null="true"></property>
11         <one-to-one name="card" class="IdCard"></one-to-one>
12     </class>
13 </hibernate-mapping>

  

  IdCard.hbm.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 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.proc.one2one">
 6     <class name="IdCard" table="t_idcard">
 7         <id name="id" type="int" column="id" >
 8             <generator class="native"></generator>
 9         </id>
10         <property name="cardNo" type="string" column="cardNo" length="20" not-null="true"></property>
11         <many-to-one name="user" column="userid" class="User" unique="true"></many-to-one>
12     </class>
13 </hibernate-mapping>

 

  我们可以看到一个是one-to-one一个是many-to-one的unique。

  分清楚这两个很重要,many-to-one用在保存外键的表,也就是说t_idcard表,one-to-one用在没有保存外键的表,也就是user表.

 

测试代码:

1、添加关联关系

测试:1:

 1 public class App {
 2 
 3     private static SessionFactory factory=new Configuration()
 4                     .configure()
 5                     .addClass(User.class)
 6                     .addClass(IdCard.class)
 7                     .buildSessionFactory();
 8     
 9     @Test
10     public void test(){
11         
12         Session session=factory.openSession();
13         Transaction tx=session.beginTransaction();
14         
15         User user=new User("caoyc");
16         IdCard card=new IdCard("510123588413x");
17         
18         card.setUser(user);
19         session.save(user);
20         session.save(card);
21         tx.commit();
22         session.close();
23         
24     }
25 }

  上面我们通过IdCard来维护关联关系,结果正确

  

测试2:

  下面我们来试一试通过User来维护关联关系,看结果会怎么样?

 1     @Test
 2     public void test(){
 3         
 4         Session session=factory.openSession();
 5         Transaction tx=session.beginTransaction();
 6         
 7         User user=new User("caoyc");
 8         IdCard card=new IdCard("510123588413x");
 9         
10         user.setCard(card);
11         
12         session.save(user);
13         session.save(card);
14         tx.commit();
15         session.close();
16         
17     }

技术分享

  在数据库中我们可以看到,数据库中表的结构完全一致,而且在t_user中也插入了数据,在t_idcard表中也同样有数据,只不过,t_idcard表中的userid列为null,也就是说,通过user无法维护关联关系

  【总结】:在有外键的一方,可以维护关联关系,而在没有外键的一方无法维护关联关系

 

测试3:

  我们交换user对象和card对象的保存顺序

1 session.save(card);
2 session.save(user);

  结果数据也能够正常插入到数据库中,结果和测试1相同。那么交换保存顺序是否有其他影响呢?答案是肯定的,虽然数据同样插入进去了,但是在具体插入过程却有不同。

  在测试1中:我们先保存的user,通过insert into语句我们将数据正确插入,然后我们在保存card,而此时的user对象由于已经在数据库中存在,那么必然有主键ID存在,我们在插入到IdCard表中,数据全部完全插入。具体sql语句

1 Hibernate: insert into t_user (name) values (?)
2 Hibernate: insert into t_idcard (cardNo, userid) values (?, ?)

  在测试3中:我们先将card的数据保存到idcard表中,而此时的user的id值为null,所有在插入到idcard中是,userid会是nul

  l技术分享

  然后在插入user到t_user表中,那么此时user的主键值已经生成。为了维护关联关系

  系统会有执行一条语句

  update t_idcard set cardNo=?, userid=? where id=?

  所有在测试3中,我们会看到

1 Hibernate: insert into t_idcard (cardNo, userid) values (?, ?)
2 Hibernate: insert into t_user (name) values (?)
3 Hibernate: update t_idcard set cardNo=?, userid=? where id=?

  【总结】:在保存数据时,我们先保存没有外键的一方,然后在保存有外键的一方,这样执行效率更高

 

Hibernate 一对一关联查询

标签:

原文地址:http://www.cnblogs.com/caoyc/p/5602418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!