唯一外键映射
一、模型设计
1、创建Person实体类
package com.**.hibernate.pojo.one2one_fk;
public class Person{
private Integer id;
private String name;
//关联身份证
private Card card; |
2、创建实体类
package com.**.hibernate.pojo.one2one_fk;
public class Card{
private Integer id;
private String number;
//关联公民
private Person person;} |
3、配置Person
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.**.hibernate.pojo.one2one_fk">
<class name="Person" table="t_person_fk">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- 一对一 -->
<one-to-one name="card" class="Card"/>
</class>
</hibernate-mapping> |
4、配置Card
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.**.hibernate.pojo.one2one_fk">
<class name="Card" table="t_card_fk">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="number" column="number"></property>
<!-- 唯一外键多对一(一对一) -->
<many-to-one name="person" class="Person"
column="person_id" unique="true"/>
</class>
</hibernate-mapping> |
5
、将映射文件加入hibernte.cfg.xml
<mapping resource="com/**/hibernate/pojo/one2one_fk/Person.hbm.xml"/>
<mapping resource="com/**/hibernate/pojo/one2one_fk/Card.hbm.xml"/> |
二、测试保存
package com.**.hibernate.test;
public class One2OneFKTest {
/**
* 添加:唯一外键关联
*/
@Test
public void testCreatePerson(){
Person p = new Person();
p.setName("Helen");
Card c = new Card();
c.setNumber("1001");
p.setCard(c);
c.setPerson(p);
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
session.save(p);
session.save(c);
tx.commit();
session.close();
}
}
|
三、级联保存
1、修改Person配置文件
<!-- 一对一映射 --> <one-to-one name="card" class="Card" cascade="save-update"/> |
2、测试级联保存
@Test public void testCascadeSave(){ Person p = new Person(); p.setName("奥特曼"); Card c = new Card(); c.setNumber("1001"); p.setCard(c); c.setPerson(p); Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); session.save(p); tx.commit(); session.close(); } |
三、级联删除
1、修改Person配置文件
<!-- 一对一映射 --> <one-to-one name="card" class="Card" cascade="save-update,delete"/> |
2、测试级联删除
删除时必须要设置级联删除,否则报告错误:Cannot delete or update a parent row: a foreign key constraint fails
@Test public void testCascadeDelete(){ Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); Person person = session.get(Person.class, 1); session.delete(person); tx.commit(); session.close(); } |
联合主键关联映射
一、模型设计
1、创建Person实体类
类和前面没有变化
package com.**.hibernate.pojo.one2one_pk;
public class Person{
private Integer id;
private String name;
//关联身份证
private Card card; |
2、创建Card实体类
类和前面没有变化
package com.**.hibernate.pojo.one2one_pk;
public class Card{
private Integer id;
private String name;
//关联公民
private Person person;} |
3、配置Person
<?
xml version="1.0" encoding="utf-8"
?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.**.hibernate.pojo.one2one_pk">
<class name="Person" table="t_person_pk">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- 一对一 -->
<one-to-one name="card" class="Card"/>
</class> </hibernate-mapping> |
4、配置Card
注意:为了保证一对一关系中的关联表之间的主键始终保持一致,需要在
被动主键的一方设置主键生成策略为
assigned
constrained:被强迫的(被动主键)
<?
xml version="1.0" encoding="utf-8"
?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.**.hibernate.pojo.one2one_pk">
<class name="Card" table="t_card_pk">
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
<property name="name" column="name"></property>
<!-- 主键关联(一对一:被动的主键) -->
<one-to-one name="person" class="Person" constrained="true"/>
</class>
</hibernate-mapping>
|
5
、将映射文件加入hibernte.cfg.xml
<mapping resource="com/**/hibernate/pojo/one2one_pk/Person.hbm.xml"/>
<mapping resource="com/**/hibernate/pojo/one2one_pk/Card.hbm.xml"/> |
二、测试保存
注意:包的导入为
_pk
保存 c 对象之前,需要设置 c 的id:c.setId(p.getId());
package com.**.hibernate.test;
import com.**.hibernate.pojo.one2one_pk.Card;
import com.**.hibernate.pojo.one2one_pk.Person;
public class One2OnePKTest {
/**
* 一对一关系(主键关联)
*/
@Test
public void testCreatePerson(){
Person p = new Person();
p.setName("奥特曼");
Card c = new Card();
c.setNumber("1001");
p.setCard(c);
c.setPerson(p);
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
session.save(p);
c.setId(p.getId());
//保存p后才能获取id
session.save(c);
tx.commit();
session.close();
}
}
|
级联保存:因为需要为card对象手动的设置id属性,所以级联保存在业务上不合理
三、级联删除
删除时必须要设置级联删除,否则报告错误:Cannot delete or update a parent row: a foreign key constraint fails
1、修改Person配置文件
<!-- 一对一映射 --> <one-to-one name="card" class="Card" cascade="delete" /> |
2、测试
@Test public void testCascadeDelete(){ Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); Person person = session.get(Person.class, 1); session.delete(person); tx.commit(); session.close(); } |