hibernate one-to-one 一对一唯一外键关联映射_单向

hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

hibernate one-to-one 一对一唯一外键关联映射_单向

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

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

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联

类:

public class Person {

private Integer id;
private String name;
private IdCard idCard;




public class IdCard {

private Integer id;
private String idNo;




hbm.xml

Person.hbm.xml


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<class name="Person" table="person2" >
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" length="50" type="java.lang.String" />
<many-to-one name="idCard" column="card_id" unique="true" />
</class>

</hibernate-mapping>


IdCard.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<class name="IdCard" table="idcard2" >
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="idNo" column="id_no" length="30" type="java.lang.String" />
</class>

</hibernate-mapping>


测试用例:

import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class OneToOneTest extends TestCase {

public void testSave1(){
Session session = null;
Transaction ta = null;
try{
session = HibernateUtil.getSession();
ta = session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setIdNo("123888888");
Person p = new Person();
p.setName("Tom");
p.setIdCard(idCard);
session.save(idCard); //one-to-one时,可以不用这步,但many-to-one中要,因为casdese="none"
session.save(p);
ta.commit();
}catch(Exception e){
e.printStackTrace();
if(ta != null){
ta.rollback();
}
}finally{
//关闭session, user变为detached离线对象
HibernateUtil.closeSession(session);
}

}


public void testGet1(){
Session session = null;
Transaction ta = null;
try{
session = HibernateUtil.getSession();
ta = session.beginTransaction();
Person p = (Person) session.get(Person.class, new Integer(2));
System.out.println("person.name=" + p.getName());
System.out.println("idCard.cardNo=" + p.getIdCard().getIdNo());
ta.commit();
}catch(Exception e){
e.printStackTrace();
if(ta != null){
ta.rollback();
}
}finally{
//关闭session, user变为detached离线对象
HibernateUtil.closeSession(session);
}

}


}



===============================================================

改为双向:

类:

public class IdCard {

private Integer id;
private String idNo;
private Person person;




<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.model">
<class name="IdCard" table="idcard2" >
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="idNo" column="id_no" length="30" type="java.lang.String" />
<one-to-one name="person" property-ref="idCard"></one-to-one>
</class>

</hibernate-mapping>

说明:

property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应

property-ref 指:person类中的idCard变量


测试用例:

public void testGet2(){
Session session = null;
Transaction ta = null;
try{
session = HibernateUtil.getSession();
ta = session.beginTransaction();
IdCard ic = (IdCard)session.get(IdCard.class, new Integer(1));
System.out.println("IdCard.idNo =" + ic.getIdNo());
System.out.println("Person.name = " + ic.getPerson().getName());
ta.commit();
}catch(Exception e){
e.printStackTrace();
if(ta != null){
ta.rollback();
}
}finally{
//关闭session, user变为detached离线对象
HibernateUtil.closeSession(session);
}

}

Hibernate: select idcard0_.id as id0_1_, idcard0_.id_no as id2_0_1_, person1_.id as id1_0_, person1_.name as name1_0_, person1_.card_id as card3_1_0_ from idcard2 idcard0_ left outer join person2 person1_ on idcard0_.id=person1_.card_id where idcard0_.id=?
IdCard.idNo =123888888
Person.name = Tom

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值