两个对象之间是一对一的关系,如Person-IdCard
有两种策略可以实现一对一的关联映射
主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 唯一外键关联
外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;
1、实体对象
1.1 Person实体对象
package demo.entity; /** * 人实体 * @author Don * @date:日期:2017年4月11日 时间:上午11:04:59* * @version 1.0 */ public class Person { private String id; private String name; //一对一关系的实体表现 private IdCard card; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IdCard getCard() { return card; } public void setCard(IdCard card) { this.card = card; } }
1.2 IdCard实体对象
package demo.entity; /** * 身份证实体 * @author Don * @date:日期:2017年4月11日 时间:上午11:05:53* * @version 1.0 */ public class IdCard { private String id; private String code; //一对一关系的实体表现 private Person person; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCode() { return code; } public void setCode(String card) { this.code = card; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
2、一对一关系映射(主键关联)
2.1 Person对象映射配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 在这个一对一的关系中,Person可以自己产生主键值 --> <!-- name:实体, table:表名 --> <class name="demo.entity.Person" table="o2o_person"> <!-- name:主键的名字,column:主键数据库表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator类来生成主键 --> <generator class="uuid" /> </id> <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) --> <property name="name" /> <one-to-one name="card" class="demo.entity.IdCard" cascade="all"></one-to-one> </class> </hibernate-mapping>
2.2 IdCard对象映射配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- name:实体, table:表名 --> <class name="demo.entity.IdCard" table="02o_card"> <!-- name:主键的名字,column:主键数据库表列,identity自增 --> <id name="Id"> <!-- 主键关联,通过Person的主键生成IdCard的主键--> <generator class="foreign"> <param name="property">person</param> </generator> </id> <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) --> <property name="code" /> <one-to-one name="person" class="demo.entity.Person" cascade="all"></one-to-one> </class> </hibernate-mapping>
3、一对一关系映射(唯一外键)
3.1 Person对象映射配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 在这个一对一的关系中,Person可以自己产生主键值 --> <!-- name:实体, table:表名 --> <class name="demo.entity.Person" table="o2o_person_forengn"> <!-- name:主键的名字,column:主键数据库表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator类来生成主键 --> <generator class="uuid" /> </id> <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) --> <property name="name" /> <!-- card中使用person描述Person对象 --> <one-to-one name="card" property-ref="person" cascade="all"></one-to-one> </class> </hibernate-mapping>
3.2 IdCard对象映射配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- name:实体, table:表名 --> <class name="demo.entity.IdCard" table="02o_card_forergn"> <!-- name:主键的名字,column:主键数据库表列,identity自增 --> <id name="Id"> <!-- 生成主键--> <generator class="uuid"></generator> </id> <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) --> <property name="code" /> <!-- IdCard添加外键,IdCard和Person具有多对一的关系,实现一对一,则限制unique为true --> <many-to-one name="person" column="personId" unique="true" cascade="all"></many-to-one> </class> </hibernate-mapping>
4、测试保存
package demo.test; import org.hibernate.classic.Session; import demo.entity.IdCard; import demo.entity.Person; import demo.util.HibernateUtil; public class TestSave { public static void main(String[] args) { Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); Person person = new Person(); person.setName("张三"); //身份证的主键Id依赖于Perrson,因此需要添加Person IdCard card = new IdCard(); card.setCode("110"); /* * 保存方式一 * card.setPerson(person); person.setCard(card); session.save(person); */ //方式二(IdCard是关系的维护方) card.setPerson(person); session.save(card); session.getTransaction().commit(); } }
要么忍,要么狠,要么滚!