Hibernate中的一对一的关系(二)

唯一外键
       通过一个外键将两个表关联到一起。
       下面以用户和用户组为例进行说明,一个用户对应一个用户组,用户表通过一个group_id与用户组进行关联。
TUser.java
java 代码
 
  1. package com.tyq.vo;  
  2.   
  3. public class TUser {  
  4.   
  5.     private int    id;  
  6.     private String name;  
  7.     private String password;  
  8.     private int    age;  
  9.     private TGroup group;  
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     private void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public String getPassword() {  
  23.         return password;  
  24.     }  
  25.     public void setPassword(String password) {  
  26.         this.password = password;  
  27.     }  
  28.     public int getAge() {  
  29.         return age;  
  30.     }  
  31.     public void setAge(int age) {  
  32.         this.age = age;  
  33.     }  
  34.     public TGroup getGroup() {  
  35.         return group;  
  36.     }  
  37.     public void setGroup(TGroup tgroup) {  
  38.         this.group = tgroup;  
  39.     }  
  40. }  
映射文件TUser.hbm.xml
java 代码
 
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.tyq.vo">  
  6.     <class name="TUser" table="tuser">  
  7.         <id name="id" column="id">  
  8.             <generator class="native" />  
  9.         </id>  
  10.         <property name="name" column="name" type="string"  
  11.             not-null="true" />  
  12.         <property name="password" column="password" type="string"  
  13.             not-null="true" />  
  14.         <property name="age" column="age" type="integer" />  
  15.         <many-to-one name="group" class="TGroup" column="group_id" unique="true"/>  
  16.     </class>  
  17. </hibernate-mapping>  
TGroup.java
java 代码
 
  1. package com.tyq.vo;  
  2.   
  3. public class TGroup {  
  4.     private int     id;  
  5.     private String  name;  
  6.     private TUser user;  
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public TUser getUser() {  
  20.         return user;  
  21.     }  
  22.     public void setUser(TUser user) {  
  23.         this.user = user;  
  24.     }  
  25.       
  26. }  
映射文件TGroup.hbm.xml
java 代码
 
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.tyq.vo">  
  6.     <class name="TGroup" table="tgroup">  
  7.         <id name="id" column="id">  
  8.             <generator class="native" />  
  9.         </id>  
  10.         <property name="name" column="name" type="string"  
  11.             not-null="true" />  
  12.             <one-to-one name="user" class="TUser" property-ref="group"/>  
  13.     </class>  
  14. </hibernate-mapping>  
用户表:
+-----------+----------------+------+-----+---------+----------------+
| Field        | Type              | Null  | Key | Default | Extra               |
+-----------+----------------+------+-----+---------+----------------+
| id            | int(11)            | NO   | PRI  | NULL    | auto_increment |
| name       | varchar(40)    | NO   | UNI  |            |                         |
| password | varchar(50)    | NO    |       |            |                          |
| age          | int(11)           | YES   |       | NULL    |                        |
| group_id   | int(11)          | YES   |       | NULL    |                      |
+------------+---------------+------+-----+---------+----------------+
用户组表:
+-------+---------------+------+-----+---------+----------------+
| Field   | Type            | Null | Key   | Default | Extra              |
+-------+---------------+------+-----+---------+----------------+
| id       | int(11)          | NO   | PRI  | NULL    | auto_increment |
| name  | varchar(100) | YES  |        | NULL    |                      |
+-------+--------------+------+------+---------+----------------+

测试代码:
java 代码
 
  1. TUser tuser = new TUser();  
  2. tuser.setAge(12);  
  3. tuser.setName("tyqqw");  
  4. tuser.setPassword("liuhello");  
  5. TGroup group = new TGroup();  
  6. group.setName("haha");  
  7. tuser.setGroup(group);  
  8. UserDAOImpl dao = (UserDAOImpl)userDAO;  
  9. Session session = dao.getSessionFactory().openSession();  
  10. Transaction tx = session.beginTransaction();  
  11. session.saveOrUpdate(tuser);  
  12. session.saveOrUpdate(group);  
  13. tx.commit();  
  14. session.close();  

这时向用户表和用户组表中插入的数据是
用户表:
+----+-------+----------+------+----------+
| id | name  | password | age  | group_id |
+----+-------+----------+------+----------+
|  2 | tyqqw | liuhello |   12 |        1 |
+----+-------+----------+------+----------+
用户组表:
+----+------+
| id | name |
+----+------+
|  1 | haha |
+----+------+
从group_id与用户组id相同可以看出,他们通过group_id将两张表关联到了一起。
查询测试:
java 代码
 
  1. TUser tuser = new TUser();  
  2.     UserDAOImpl dao = (UserDAOImpl)userDAO;  
  3.     Session session = dao.getSessionFactory().openSession();  
  4.   
  5.     TGroup tgroup= (TGroup) session.load(TGroup.class,1);  
  6.     if(tgroup.getUser() != null){  
  7.         System.err.println(tgroup.getUser().getName());  
  8.     }  
  9.     session.close();  
输出:tyqqw
由于我们在表的设计时是双向关联的我们同样可以通过用户查询到用户组。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值