这篇文章讲述的是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>
添加操作
注:同第一种且不存在顺序的问题
查询操作
注:同第一种操作
更新操作
注:同第一种操作
删除操作
注:同第一种操作