六、Hibenate一对一主键关联(单向关联)

一、Hibenate一对一主键关联(单向关联)

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

Pepole           IDcard                  tab_people     tab_idcard

-id:int          id:int                  id             id

-name:string     -idcard_code:string     name           IDcard_code

-sex:String                              sex

-age:int                                 age

-idcard:IDcard

(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,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

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

 

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

IDcard.java

public class IDcard {
    private Integer id;// 标识符

    private String idcard_code;// 身份证号码
   
    public IDcard(){
       
    }

   //省略set、get方法

}

Peopel.java

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

    //省略set、get方法

}

IDCard.hbm.xml

 <hibernate-mapping>
     <class name="com.keli.pojo.IDcard1" 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>
     </class>
 </hibernate-mapping>

People.hbm.xml

 <hibernate-mapping>
     <class name="com.keli.pojo.People1" table="tab_people">
         <id name="id">
             <generator class="foreign">
                 <param name="property">idcard</param>
             </generator>
         </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>
         <one-to-one name="idcard" constrained="true"/>

     </class>
 </hibernate-mapping>

 

(4)、测试

public class TestOne2OnetPK1 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("妖人");
           
            //不会出现TransientObjectException异常
            //因为一对一主键关系映射中,默认了casecade属性
            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, 6);
            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一对一主键关联映射(单向关联People---->IDcard)

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射:

    <id name="id">
        <!-- person的主键来源idCard,也就是共享idCard的主键 -->
        <generator class="foreign">
            <param name="property">idcard</param>
        </generator>
    </id>
    <property name="name"/>
    <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
    constrained="true",    表明当前主键上存在一个约束,person的主键作为外键参照了idCard   
     -->
    <one-to-one name="idCard" constrained="true"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值