九、Hibernate一对一唯一外键关联(双向关联)

一、Hibernate一对一唯一外键关联(单向关联)

(1)实体类与表间的关系

Pepole           IDcard                  tab_people     tab_idcard

-id:int          id:int                  id             id

-name:string     idcard_code:string      name           IDcard_code

-sex:String      pepole:Pepole           sex

-age:int                                 age

-idcard:IDcard                           card_id

 

(2)、创建表语句

CREATE TABLE `tab_idcard` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `IDcard_code` varchar(45) NOT NULL COMMENT '身份证号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `tab_idcard` (`id`,`IDcard_code`) VALUES
 (1,'22019523321*****'),
 (2,'22296325413*****'),
 (3,'12245435878*****');

CREATE TABLE `tab_people` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` int(10) unsigned NOT NULL,
  `sex` varchar(2) NOT NULL,
  `card_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `tab_people` (`id`,`name`,`age`,`sex`,`card_id`) VALUES
 (1,'小明',22,'男',1),
 (2,'小红',20,'女',2),
 (3,'小刚',30,'男',3);

 

(3)、创建实体类与映射文件

IDcard.java

public class IDcard {
    private Integer id;// 标识符
    private String idcard_code;// 身份证号码
    private People people;
    public IDcard(){
       
    }

People.java

public class People {
    private Integer id;//唯一性标识
   
    private String name;//公民姓名
   
    private String sex;//公民性别
   
    private int age;//公民年龄
   
    private IDcard idcard;//身份证实体对象
   
    public People(){
       
    }

IDcard.hbm.xml

 <hibernate-mapping>
     <class name="com.keli.pojo.IDcard" table="tab_idcard">
         <id name="id" column="id" type="int">
            <generator class="native"/>
        </id>
        <property name="idcard_code" type="string" length="45" not-null="true">
            <column name="IDcard_code"/>
        </property>
        <one-to-one name="people" property-ref="idcard"/>
     </class>
 </hibernate-mapping>

People.hbm.xml

 <hibernate-mapping>
     <class name="com.keli.pojo.People" table="tab_people">
         <id name="id">
             <generator class="native"/>
         </id>
         <property name="name" type="string" length="45">
             <column name="name"/>
         </property>
         <property name="sex" type="string" length="2">
             <column name="sex"/>
         </property>
         <property name="age" type="int">
             <column name="age"/>
         </property>
         <many-to-one name="idcard" unique="true">
             <column name="card_id"/>
         </many-to-one>
     </class>
 </hibernate-mapping>

 

(4)、测试

public class TestOne2OnetUFK2 extends TestCase{
    public void testSave1(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
           
            IDcard idCard = new IDcard();
            idCard.setIdcard_code("888888888888");
           
            People people = new People();
            people.setName("容祖儿");
            people.setIdcard(idCard);
            people.setAge(38);
            people.setSex("妖人");
           
            //不能成功保存,因为IDcard是Transient状态
            session.save(people);
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
   
    public void testSave2(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
           
            IDcard idCard = new IDcard();
            idCard.setIdcard_code("888888888888");
            session.save(idCard);
           
            People people = new People();
            people.setName("容祖儿");
            people.setIdcard(idCard);
            people.setAge(38);
            people.setSex("妖人");
           
            //可以保存
            session.save(people);
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
   
    public void testLoad1(){
        Session session = null;
        try{
            session = HibernateInitialize.getSession();
            session.beginTransaction();
           
            People p1 = (People)session.load(People.class, 8);
            System.out.println("People.name="+p1.getName());
            System.out.println("People.age="+p1.getAge());
            System.out.println("People.sex="+p1.getSex());
            System.out.println("People.idcard_code="+p1.getIdcard().getIdcard_code());
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateInitialize.closeSession();
        }
    }
}

 

说明:

hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="people" property-ref="idcard"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值