hibernate一对一关联一对一唯一外键关联实例代码



hibernate一对唯一外键关联映射是多对一关联映射的特例,可以使用<many-to-one>标签,指定多的一端的unique=true,这就限制了多的一端的多重性是以,这种映射一对一唯一外键关联。

实例步骤:

建立POJO类:IdCard.java和Person.java, 创建Hibernate配置文件,把两个hbm文件和其绑定。在Person.java面建立一个IdCard类型的属性。 在Person的hbm文件中添加:<many-to-one name=”idCard” unique=”true”/>

代码实例:

IdCard.java:

public class IdCard {

    private int id;

    private String cardNo;

Person.java:

public class Person {

    private int id;

    private String name;

    private IdCard idCard;

IdCard.hbm.xml文件:

<hibernate-mapping>

    <class name=”IdCard” table=”t_idcard”>

       <id name=”id”>

           <generator class=”native”/>

       </id>

       <property name=”cardNo”/>

    </class>

</hibernate-mapping>

Person.hbm.xml文件:

<hibernate-mapping>

    <class name=”Person” table=”t_person”>

       <id name=”id”>

           <generator class=”native”/>

       </id>

       <property name=”name”/>

       <many-to-one name=”idCard” unique=”true”/>

    </class>

</hibernate-mapping>

测试代码:

public class One2OneTest extends TestCase {

    public void testSave1() {

       Session session = null;

       try {

           session = HibernateUtils.getSession();

           session.beginTransaction();

           IdCard idCard = new IdCard();

           idCard.setCardNo(“88888888888888″);

           Person person = new Person();

           person.setName(“张三”);

           person.setIdCard(idCard);

           //不能成功保存,因为IdCard是Transient状态

           session.save(person);

           session.getTransaction().commit();

       }catch(Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally {


           HibernateUtils.closeSession(session);

       }

    }

    public void testSave2() {

       Session session = null;

       try {

           session = HibernateUtils.getSession();

           session.beginTransaction();

           IdCard idCard = new IdCard();

           idCard.setCardNo(“88888888888888″);

           session.save(idCard);

                     Person person = new Person();

           person.setName(“张三”);

           person.setIdCard(idCard);

           session.save(person);

           session.getTransaction().commit();

       }catch(Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally {

           HibernateUtils.closeSession(session);

       }

    }

    public void testLoad1() {

       Session session = null;

       try {

           session = HibernateUtils.getSession();

           session.beginTransaction();

           Person person =

(Person)session.load(Person.class, 2);

           System.out.println(“person.name=” +

person.getName());

           System.out.println(“idCard.cardNo=” +

person.getIdCard().getCardNo());

           session.getTransaction().commit();

       }catch(Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally {

           HibernateUtils.closeSession(session);

       }

    }

}

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

步骤基本和单向一致,只需在IdCard.java加入Person对象的引用,并在IdCard.hbm.xml加入<one-to-one>标签,相应代码如下:

IdCard.java加入:

private Person person;

IdCard.hbm.xml加入:

<one-to-one name=”person” property-ref=”idCard”/>