(六)Hibernate之单向一对一外键关联映射

hibernate一对一唯一外键关联映射(单向关联Citizen---->IDCard)

一对唯一外键关联映射是多对一关联映射的特例

 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。

 

具体做法

1. 单向一对一关联:对象模型和关系模型不匹配。

   对象模型上:主控方持有被控方实体类的引用。

   关系模型上:主控方对应表中添加一个外键引用自被控方的主键,这个外键必须添加唯一约束。


2. 在主控方的映射文件中:

  <many-to-one name="属性名" column="外键名" unique="true" [cascade="all"]/>


Citizen.java


Java代码   收藏代码
  1. <span style="font-size: large;">package com.javacrazyer.domain;  
  2.   
  3. public class Citizen {  
  4.     private Long id;  
  5.     private String name;  
  6.     private Boolean gender;  
  7.       
  8.     //一对一关联中:主控方持有被控方的引用  
  9.     private IDCard idCard;  
  10.   
  11.     public Long getId() {  
  12.         return id;  
  13.     }  
  14.   
  15.     public void setId(Long id) {  
  16.         this.id = id;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public Boolean getGender() {  
  28.         return gender;  
  29.     }  
  30.   
  31.     public void setGender(Boolean gender) {  
  32.         this.gender = gender;  
  33.     }  
  34.   
  35.     public IDCard getIdCard() {  
  36.         return idCard;  
  37.     }  
  38.   
  39.     public void setIdCard(IDCard idCard) {  
  40.         this.idCard = idCard;  
  41.     }  
  42.       
  43.     public String toString(){  
  44.         return "id=" + this.id + ",name=" + this.name + ",gender=" + this.gender;  
  45.     }  
  46. }  
  47. </span>  


 IDCard.java


Java代码   收藏代码
  1. <span style="font-size: large;">package com.javacrazyer.domain;  
  2.   
  3. public class IDCard {  
  4.     private Long id;  
  5.     private String no;  
  6.     public Long getId() {  
  7.         return id;  
  8.     }  
  9.     public void setId(Long id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getNo() {  
  13.         return no;  
  14.     }  
  15.     public void setNo(String no) {  
  16.         this.no = no;  
  17.     }  
  18.       
  19.     public String toString(){  
  20.         return "id=" + id + ",no=" + this.no;  
  21.     }  
  22. }  
  23. </span>  


 Citizen.hbm.xml


Xml代码   收藏代码
  1. <span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <class name="com.javacrazyer.domain.Citizen">  
  8.         <id name="id" column="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="name"/>  
  12.         <property name="gender"/>  
  13.           
  14.         <!-- 映射基于外键一对一关联 -->  
  15.         <many-to-one name="idCard" column="card_id" unique="true" cascade="all"/>  
  16.     </class>  
  17. </hibernate-mapping></span>  


 IDCard.hbm.xml


Java代码   收藏代码
  1. <span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <class name="com.javacrazyer.domain.IDCard" >  
  8.         <id name="id" column="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="no"/>  
  12.     </class>  
  13. </hibernate-mapping></span>  


 hibernate.cfg.xml


Java代码   收藏代码
  1. <span style="font-size: large;"><?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <!-- 数据库连接参数配置 -->  
  8.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  9.         <property name="hibernate.connection.url">jdbc:mysql:///test</property>  
  10.         <property name="hibernate.connection.username">root</property>  
  11.         <property name="hibernate.connection.password">root</property>  
  12.         <!-- 数据库言的配置 -->  
  13.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  14.         <property name="hibernate.show_sql">true</property>  
  15.         <property name="hibernate.format_sql">true</property>  
  16.         <property name="hibernate.hbm2ddl.auto">update</property>  
  17.         <!-- 声明实体关系映射文件 -->  
  18.         <mapping resource="com/javacrazyer/domain/IDCard.hbm.xml" />  
  19.         <mapping resource="com/javacrazyer/domain/Citizen.hbm.xml" />  
  20.     </session-factory>  
  21. </hibernate-configuration></span>  


 启动下Hibernate,自动生成数据库表,数据库表的DDL语句如下

   idcard表



Sql代码   收藏代码
  1. <span style="font-size: large;">   create table `test`.`idcard`(  
  2.         `id` BIGINT not null auto_increment,  
  3.        `noVARCHAR(255),  
  4.         primary key (`id`)  
  5.     );  
  6.   
  7.     create unique index `PRIMARYon `test`.`idcard`(`id`);</span>  

 

   citizen表

 

Sql代码   收藏代码
  1. <span style="font-size: large;">create table `test`.`citizen`(  
  2.         `id` BIGINT not null auto_increment,  
  3.        `nameVARCHAR(255),  
  4.        `gender` BIT,  
  5.        `card_id` BIGINT unique,  
  6.         primary key (`id`)  
  7.     );  
  8.   
  9.     alter table `test`.`citizen`    
  10.         add index `FK92029348E9FA33E0`(`card_id`),   
  11.         add constraint `FK92029348E9FA33E0`   
  12.         foreign key (`card_id`)   
  13.         references `test`.`idcard`(`id`);  
  14.     create unique index `PRIMARYon `test`.`citizen`(`id`);  
  15.     create unique index `card_id` on `test`.`citizen`(`card_id`);  
  16.     create index `FK92029348E9FA33E0` on `test`.`citizen`(`card_id`);</span>  

 



 

   

Hibernate辅助类

 

Java代码   收藏代码
  1. <span style="font-size: large;">package com.javacrazyer.common;  
  2.   
  3. import org.hibernate.SessionFactory;  
  4. import org.hibernate.cfg.Configuration;  
  5.   
  6. /** 
  7.  * Hibernate工具类 
  8.  *  
  9.  */  
  10. public class HibernateUtil {  
  11.     private static final SessionFactory factory;  
  12.       
  13.     private HibernateUtil(){}  
  14.       
  15.     static{  
  16.         //加载Hibernate全局配置文件,根据配置信息创建SessionFactory工厂实例  
  17.         factory = new Configuration().configure().buildSessionFactory();  
  18.     }  
  19.       
  20.     public static SessionFactory getSessionFactory(){  
  21.         return factory;  
  22.     }  
  23. }  
  24. </span>  

 测试类

 

Java代码   收藏代码
  1. <span style="font-size: large;">package com.javacrazyer.test;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.junit.AfterClass;  
  6. import org.junit.BeforeClass;  
  7. import org.junit.Test;  
  8.   
  9. import com.javacrazyer.common.HibernateUtil;  
  10. import com.javacrazyer.domain.Citizen;  
  11. import com.javacrazyer.domain.IDCard;  
  12.   
  13. public class MappingTest {  
  14.     private static SessionFactory sessionFactory;  
  15.       
  16.     @BeforeClass  
  17.     public static void init(){  
  18.         sessionFactory = HibernateUtil.getSessionFactory();  
  19.     }  
  20.       
  21.     @AfterClass  
  22.     public static void destroy(){  
  23.         sessionFactory = null;  
  24.     }  
  25.       
  26.     @Test  
  27.     public void testSave(){  
  28.         Session session = sessionFactory.openSession();  
  29.         session.beginTransaction();  
  30.           
  31.         IDCard ic = new IDCard();  
  32.         ic.setNo("xx0001");  
  33.           
  34.         Citizen citizen = new Citizen();  
  35.         citizen.setName("赵C");  
  36.           
  37.         //设置一对一的关联  
  38.         citizen.setIdCard(ic);  
  39.           
  40.         session.save(citizen);  
  41.           
  42.         session.getTransaction().commit();  
  43.         session.close();  
  44.     }  
  45.       
  46.     @Test  
  47.     public void testGet(){  
  48.         Session session = sessionFactory.openSession();  
  49.         session.beginTransaction();  
  50.           
  51.         Citizen c = (Citizen)session.get(Citizen.class, Long.valueOf(1));  
  52.           
  53.         System.out.println(c.getName());  
  54.           
  55.         IDCard idcard = c.getIdCard();  
  56.           
  57.         System.out.println(idcard.getId());  
  58.           
  59.         session.getTransaction().commit();  
  60.         session.close();  
  61.           
  62.         System.out.println(idcard.getNo());  
  63.     }  
  64.       
  65. }</span> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值