Hibernate关联关系映射之一对一(主键关联)

 

在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的。

就以例子来说明:一个人对应一张身份证。对其进行增删改。

对于人在数据创建表的时候,我们就给他两个字段,一个是id号,一个就是名字。

那么对于身份证也就是两个字段,一个对应于一个人相同的id号,一个就是身份证码。

1 那么来创建数据库表:

 人为主表,身份证为从表。

1 create table person(
2 id bigint primary key auto_increment,
3 userName varchar(20)
4 );
5  
6 create table card(
7 id bigint primary key,
8 cardNo varchar(18)
9 );

创建实体类的时候,人要引用身份证卡的信息,同样身份证卡也要引用人这个类。

2 那么来创建实体类:

人:

 1 package com.cy.beans;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Person implements Serializable {
 6 
 7     private static final long serialVersionUID = 1L;
 8     private long id;
 9     private String userName;
10     private Card card;// 卡 一对一关联
11 
12     public void person() {
13 
14     }
15 
16     public long getId() {
17         return id;
18     }
19 
20     public void setId(long id) {
21         this.id = id;
22     }
23 
24     public String getUserName() {
25         return userName;
26     }
27 
28     public void setUserName(String userName) {
29         this.userName = userName;
30     }
31 
32     public Card getCard() {
33         return card;
34     }
35 
36     public void setCard(Card card) {
37         this.card = card;
38     }
39 
40     @Override
41     public String toString() {
42         return "Person [id=" + id + ", userName=" + userName + ", card=" + card
43                 + "]";
44     }
45 
46 }

 

身份证:

 1 package com.cy.beans;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Card implements Serializable{
 6 
 7     
 8     private static final long serialVersionUID = 1L;
 9     
10     private long id;
11     private String cardNo;
12     private Person person;//人  一对一关联
13     
14     public Card(){
15         
16     }
17     public long getId() {
18         return id;
19     }
20     public void setId(long id) {
21         this.id = id;
22     }
23     public String getCardNo() {
24         return cardNo;
25     }
26     public void setCardNo(String cardNo) {
27         this.cardNo = cardNo;
28     }
29     public Person getPerson() {
30         return person;
31     }
32     public void setPerson(Person person) {
33         this.person = person;
34     }
35     @Override
36     public String toString() {
37         return "Card [id=" + id + ", cardNo=" + cardNo + ", person=" + person
38                 + "]";
39     }
40     
41 
42 }

 

 现在创建映射文件

Person.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     
 6     <hibernate-mapping>
 7     
 8     <class name="com.cy.beans.Person" table="person" catalog="j2ee">   <!-- catalog数据库 -->
 9     
10               <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
11                   <column name="id"></column><!-- 此行的ID,为表字段ID -->
12                   <generator class="increment"></generator><!-- 给id指定生成策略 -->
13               </id>
14     
15               <property name="userName" type="java.lang.String">
16                  <column name="userName"></column>
17               </property>
18               
19          <!--站在主对象的一方来设置级联关系 -->
20          <!-- cascade定义的是关系两端对象到对象的级联关系,cascade有四個取值,all,none,save-update,delete
21                 all : 所有情况下均进行关联操作。 
22                 none:所有情况下均不进行关联操作。这是默认值。 
23                 save-update:在执行save/update/saveOrUpdate时进行关联操作。 
24                 delete:在执行delete时进行关联操作。 -->
25         <one-to-one name="card" class="com.cy.beans.Card" cascade="all"></one-to-one>
26   
27     
28     </class>
29      
30     </hibernate-mapping>

 

Card.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     
 6     <hibernate-mapping>
 7     <class name="com.cy.beans.Card" table="card" catalog="j2ee">   <!-- catalog数据库 -->
 8               <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
 9                  <column name="id"></column><!-- 此行的ID,为表字段ID -->
10                    <generator class="foreign"><!-- foreign主键生成器 -->
11                        <param name="property">person</param><!--类属性  -->
12                    </generator>
13               </id>
14     
15               <property name="cardNo" type="java.lang.String">
16                  <column name="cardNo"></column>
17               </property>
18          <!--站在从对象的一方来设置交出约束  -->
19          <!-- name:一对一节点  ,constrained: 约束(必须为true) -->
20          <one-to-one name="person"  class="com.cy.beans.Person" constrained="true"></one-to-one>
21   
22     </class>
23     </hibernate-mapping>

 在hibernate.cfg.xml里添加对象xml文件:

1         <mapping resource="com/cy/xmls/Person.hbm.xml"/> 
2         <mapping resource="com/cy/xmls/Card.hbm.xml"/> 

 工具类:

 1 package com.cy.tools;
 2 
 3 import org.hibernate.SessionFactory;
 4 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 5 import org.hibernate.cfg.Configuration;
 6 import org.hibernate.service.ServiceRegistry;
 7 
 8 /**
 9  * session工厂的工具类
10  * @author acer
11  *
12  */
13 
14 public class HibernateUtils {
15     
16     private static Configuration cfg;
17     private static SessionFactory sessionFactory;
18     private static ServiceRegistry serviceRegistry;
19     
20     static{
21         
22         cfg = new Configuration().configure();
23         serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
24         sessionFactory = cfg.buildSessionFactory(serviceRegistry);
25     
26     }
27     
28     public static SessionFactory getSessionFactory(){
29         return sessionFactory;
30     }
31          
32     
33 
34 }

 

IPersonDao.java接口,定义方法:

Hibernate关联关系映射之一对一(主键关联)Hibernate关联关系映射之一对一(主键关联)
 1 package com.cy.dao;
 2 
 3 import java.io.Serializable;
 4 
 5 import com.cy.beans.Person;
 6 
 7 public interface IPersonDao {
 8     /**
 9      * 添加
10      * @param p
11      */
12     public void savePerson(Person p);
13     /**
14      * 修改
15      * @param p
16      */
17     public void updatePerson(Person p);
18     /**
19      * 刪除
20      * @param p
21      */
22     public void deletePerson(Person p);
23     /**
24      * 根据id查询数据
25      * @param cls
26      * @param pk
27      * @return
28      */
29     public Person getPerson(Class<?> cls,Serializable pk);
30     
31     public void findPerson(Person p);
32 
33 }
View Code

 

写接口实现:PersonDaoImpl.java

Hibernate关联关系映射之一对一(主键关联)Hibernate关联关系映射之一对一(主键关联)
 1 package com.cy.dao.impl;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.Transaction;
 7 
 8 import com.cy.beans.Person;
 9 import com.cy.dao.IPersonDao;
10 import com.cy.tools.HibernateUtils;
11 
12 public class PersonDaoImpl implements IPersonDao {
13 
14     @Override
15     public void savePerson(Person p) {
16         //获得Session
17         Session session=null;
18         Transaction transaction=null;
19         
20         try {
21             session=HibernateUtils.getSessionFactory().openSession();//
22             transaction=session.beginTransaction();//开启事务
23             session.save(p);//添加
24             transaction.commit();//提交事务
25         } catch (Exception e) {
26             e.printStackTrace();
27             transaction.rollback();//回滚事务
28         }finally{
29             session.close();//关闭session
30         }
31 
32     }
33 
34     @Override
35     public void updatePerson(Person p) {
36         Session session=null;
37         Transaction transaction=null;
38         
39         try {
40             session=HibernateUtils.getSessionFactory().openSession();
41             transaction=session.beginTransaction();
42             session.update(p);//修改
43             transaction.commit();
44         } catch (Exception e) {
45             e.printStackTrace();
46             transaction.rollback();
47         }finally{
48             session.close();
49         }
50 
51     }
52 
53     @Override
54     public Person getPerson(Class<?> cls, Serializable pk) {
55         Session session=null;
56         Transaction transaction=null;
57         Person    person=null;
58         try {
59             session=HibernateUtils.getSessionFactory().openSession();
60             transaction=session.beginTransaction();
61             person=(Person) session.get(cls, pk);//根据id查询。pk这里指的就是id
62             transaction.commit();
63             
64         } catch (Exception e) {
65             e.printStackTrace();
66             transaction.rollback();
67         }finally{
68             session.close();
69         }
70 
71         return person;
72     }
73     @Override
74     public void deletePerson(Person p) {
75         Session session=null;
76         Transaction transaction=null;
77         
78         try {
79             session=HibernateUtils.getSessionFactory().openSession();
80             transaction=session.beginTransaction();
81             session.delete(p);//删除
82             transaction.commit();
83         } catch (Exception e) {
84             e.printStackTrace();
85             transaction.rollback();
86         }finally{
87             session.close();
88         }
89 
90     }
91 
92 
93     @Override
94     public void findPerson(Person p) {
95 
96     }
97 
98 }
View Code

 写IPersonServer.java接口

Hibernate关联关系映射之一对一(主键关联)Hibernate关联关系映射之一对一(主键关联)
 1 package com.cy.server;
 2 
 3 import java.io.Serializable;
 4 
 5 import com.cy.beans.Person;
 6 
 7 public interface IPersonServer {
 8     /**
 9      * 添加
10      * @param p
11      */
12     public void savePerson(Person p);
13     /**
14      * 修改
15      * @param p
16      */
17     public void updatePerson(Person p);
18     /**
19      * 刪除
20      * @param p
21      */
22     public void deletePerson(Long id);
23     /**
24      * 根据id查询
25      * @param cls
26      * @param pk
27      * @return
28      */
29     public Person getPerson(Class<?> cls,Serializable pk);
30     
31     public void findPerson(Person p);
32 }
View Code

 

写PersonServerImpl.java实现;

Hibernate关联关系映射之一对一(主键关联)Hibernate关联关系映射之一对一(主键关联)
 1 package com.cy.server.impl;
 2 
 3 import java.io.Serializable;
 4 
 5 import com.cy.beans.Person;
 6 import com.cy.dao.IPersonDao;
 7 import com.cy.dao.impl.PersonDaoImpl;
 8 import com.cy.server.IPersonServer;
 9 
10 public class PersonServerImpl implements IPersonServer {
11     IPersonDao dao = new PersonDaoImpl();
12 
13     @Override
14     public void savePerson(Person p) {
15         dao.savePerson(p);
16 
17     }
18 
19     @Override
20     public void updatePerson(Person p) {
21         dao.updatePerson(p);
22     }
23 
24     @Override
25     public void deletePerson(Long id) {
26         Person p = dao.getPerson(Person.class, id);
27         if (p != null) {
28             dao.deletePerson(p);
29         }
30 
31     }
32 
33     @Override
34     public Person getPerson(Class<?> cls, Serializable pk) {
35 
36         return dao.getPerson(cls, pk);
37     }
38 
39     @Override
40     public void findPerson(Person p) {
41 
42     }
43 
44 }
View Code

 

 写个PersonAction测试;

 1 package com.cy.action;
 2 
 3 import com.cy.beans.Card;
 4 import com.cy.beans.Person;
 5 import com.cy.server.IPersonServer;
 6 import com.cy.server.impl.PersonServerImpl;
 7 
 8 public class PersonAction {
 9     public static void main(String[] args) {
10         
11 //        savePerson();    
12 //        updatePerson();
13           deletePerson();
14     }
15 
16     private static void deletePerson() {
17         IPersonServer ps=new PersonServerImpl();
18         ps.deletePerson(Long.valueOf(1));
19         
20         
21     }
22 
23     private static void updatePerson() {
24         IPersonServer ps=new PersonServerImpl();
25         Person p=ps.getPerson(Person.class, Long.valueOf(1));
26         p.setUserName("小紅");
27         ps.updatePerson(p);
28         /*Hibernate: //这些hibernate所执行语句    修查询  后修改
29             select
30                 person0_.id as id1_1_0_,
31                 person0_.userName as userName2_1_0_,
32                 card1_.id as id1_0_1_,
33                 card1_.cardNo as cardNo2_0_1_ 
34             from
35                 j2ee.person person0_ 
36             left outer join
37                 j2ee.card card1_ 
38                     on person0_.id=card1_.id 
39             where
40                 person0_.id=?
41         Hibernate: 
42             update
43                 j2ee.person 
44             set
45                 userName=? 
46             where
47                 id=?
48         Hibernate: 
49             update
50                 j2ee.card 
51             set
52                 cardNo=? 
53             where
54                 id=?
55 */
56         
57         
58     }
59 
60     private static void savePerson() {
61         IPersonServer ps=new PersonServerImpl();
62         Person p=new Person();
63         p.setUserName("小明");        
64         Card c=new Card();
65         c.setCardNo("511123************");
66         //設置相互
67         p.setCard(c);
68         c.setPerson(p);
69         ps.savePerson(p);
70         /*Hibernate:   添加时 先查询主表的最大的id,先添加主表,在添加从表。   删除时则是先删除从表,在删除主表。
71             select
72                 max(id) 
73             from
74                 person
75         Hibernate: 
76             insert 
77             into
78                 j2ee.person
79                 (userName, id) 
80             values
81                 (?, ?)
82         Hibernate: 
83             insert 
84             into
85                 j2ee.card
86                 (cardNo, id) 
87             values
88                 (?, ?)
89 
90         
91     */
92         
93     }
94 }

 

上一篇:hibernate(五) hibernate一对一关系映射详解


下一篇:晒晒昨天的节日礼物