hibernate中一对一关系映射

这篇文章讲述的是hibernate中一对一关系映射,如有错误或者不当之处还望各位大神批评指正。

一对一映射(外键关联)

目标

假设一个人对应养一只狗,一只狗只能由一个人来养,完成一对一相关操作。

类编写

1.Person类:

public class Person {
    private Integer id  ;
    private String name ;
    private char sex ;
    private int age ;

    private Dog dog ;
//省略get和set方法   
}

2.Dog类:

public class Dog {
    private Integer id ;
    private String name ;
    private int age ;

    private Person person ;
//省略get和set方法
}

映射文件

1.Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-20 15:53:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.cn.cmc.model">
    <class name="Person" table="PERSON">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="sex" type="char">
            <column name="SEX" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>

        <many-to-one name="dog" cascade="all" class="com.cn.cmc.model.Dog" column="DOG_ID" unique="true"></many-to-one>

    </class>
</hibernate-mapping>

2.Dog.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-20 15:53:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.cn.cmc.model.Dog" table="DOG">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
 /*property-ref 设置外键关联*/      
        <one-to-one name="person" cascade="all" property-ref="dog" class="com.cn.cmc.model.Person"></one-to-one>

    </class>
</hibernate-mapping>

添加操作

Person person = new Person() ;

        person.setName("cmc");
        person.setAge(22);
        person.setSex('M');

        Dog dog = new Dog() ;
        dog.setName("tom");
        dog.setAge(2);

        dog.setPerson(person);
        person.setDog(dog);
//要先保存dog,生成id后才能保存person中的外键列,否则多出来update语句
        session.save(dog) ;
        session.save(person) ;

查询操作

仅查询人的时候(有外键的一方)

//仅查询person时不进行查询dog操作,二是懒加载
Person person = (Person) session.get(Person.class,84 ) ;
System.out.println(person.getName());

//使用关于外键对象时,才执行查询dog操作
Dog dog = person.getDog() ;
System.out.println(dog.getName());

查询狗的时候(无外键的一方时)

Dog dog = (Dog) session.get(Dog.class, 86) ;
System.out.println(dog.getName());

Person person = dog.getPerson() ;
System.out.println(person.getName());

注:在dog.hbm.xml中若不配置属性 property-ref=”dog” 则使用person主键进行连表,若配置,则使用person中的dog外键进行连接

更新操作

Dog dog = (Dog) session.get(Dog.class, 85) ;
dog.setName("wow")
session.update(dog);

删除操作

Dog dog = (Dog) session.get(Dog.class, 85) ;
session.delete(dog);

另一种一对一映射方法(主键关联)

*.hbm.xml文件配置

Person.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-20 15:53:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="com.cn.cmc.model">
    <class name="Person" table="PERSON">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="sex" type="char">
            <column name="SEX" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
        <one-to-one name="dog" class="com.cn.cmc.model.Dog"></one-to-one>
    </class>
</hibernate-mapping>

Dog.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-20 15:53:16 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.cn.cmc.model.Dog" table="DOG">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <!-- 外键生成方式产生主键 -->
            <generator class="foreign">
                <!-- 使用哪个属性的主键作为外键 -->
                <param name="property">person</param>
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
--constrained="true" 以使当前的主键上添加外键约束
        <one-to-one name="person" constrained="true" class="com.cn.cmc.model.Person"></one-to-one>
    </class>
</hibernate-mapping>

添加操作
注:同第一种且不存在顺序的问题
查询操作
注:同第一种操作
更新操作
注:同第一种操作
删除操作
注:同第一种操作

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80754699