`

hibernate入门二:一对一关联关系映射

阅读更多
  在hibernate中一对一关联关系映射有两种方式:共享主键和唯一外键。共享主键就是两张表的主键值都用一个值,唯一外键,顾名思义,即是在外键上加上唯一性约束。但无论是哪种方式,如果表中存在主从关系,在使用DAO的save方法保存从对象时,都必须先将主对象属性通过set方法先添加。
比如有2个类:
public class A{
private int id;
private B b;
//省略构造及getter,setter方法
}
public class B{
private int id;
//省略构造及getter,setter方法
}

B主A从,那么,在调用save方法保存A前,必须先用A的set方法将b属性对应的对象添加,否则失败。主对象可以单独保存。判断主从的依据是,数据库的设计(主要的,你设计为主表即为主控方);既是主键又是外键,则为从。被参考的主键所在的表对应的则为主。
    因为是整理,所以在说映射之前将一对一关系中的有的东西先说清楚。DAO代码不再附上,仅附上sql脚本和映射文件及对应的类,其实SQL中的外键关系在数据库表中都不用体现,因为有Hibernate映射文件约束,但为了清楚和手动插入数据的完整性,还是加上了。
    数据库MySQL5.6,脚本:
CREATE TABLE `address1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city` varchar(40) DEFAULT NULL,
  `street` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `adress` (
  `id` int(11) NOT NULL DEFAULT '0',
  `city` varchar(40) DEFAULT NULL,
  `street` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_a_p` FOREIGN KEY (`id`) REFERENCES `person` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) DEFAULT NULL,
  `gender` varchar(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `person1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) DEFAULT NULL,
  `gender` varchar(2) DEFAULT NULL,
  `adress` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_p_ad` (`adress`),
  CONSTRAINT `fk_p_ad` FOREIGN KEY (`adress`) REFERENCES `address1` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


一对一关系映射,共享主键方式:
类person为主,adress为从
package model;

/**
 * Person entity
 */

public class Person implements java.io.Serializable {
	private Integer id;
	private Adress adress;
	private String name;
	private String gender;

	/** default constructor */
	public Person() {
	}

	/** full constructor */
	public Person(Adress adress, String name, String gender) {
		this.adress = adress;
		this.name = name;
		this.gender = gender;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Adress getAdress() {
		return this.adress;
	}

	public void setAdress(Adress adress) {
		this.adress = adress;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return this.gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

}



package model;

/**
 * Adress entity
 */

public class Adress implements java.io.Serializable {
	private Integer id;
	private String city;
	private String street;
	private Person person;

	/** default constructor */
	public Adress() {
	}

	/** full constructor */
	public Adress(Integer id, String city, String street, Person person) {
		this.id = id;
		this.city = city;
		this.street = street;
		this.person = person;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getCity() {
		return this.city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getStreet() {
		return this.street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	public Person getPerson() {
		return this.person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}

}

映射文件
Person.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Person" table="person" catalog="study">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <!-- 一对一映射设置,检索策略立即加载 -->
        <one-to-one name="adress" class="model.Adress" cascade="all" lazy="false"/>
        
        <property name="name" type="java.lang.String">
            <column name="name" length="16" />
        </property>
        <property name="gender" type="java.lang.String">
            <column name="gender" length="2" />
        </property>
    </class>
</hibernate-mapping>


Adress.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="model.Adress" table="adress" catalog="study">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<!-- 使用外键生成器,直接采用外键的属性值作为主键值 -->
			<generator class="foreign">
				<param name="property">person</param>
			</generator>
		</id>
		<property name="city" type="java.lang.String">
			<column name="city" length="40" />
		</property>
		<property name="street" type="java.lang.String">
			<column name="street" length="100" />
		</property>
		<!-- 一对一映射, constrained="true"说明主键上存在外键约束 -->
		<one-to-one name="person" class="model.Person" constrained="true" />
	</class>
</hibernate-mapping>

一对一关系映射,唯一外键方式:
类一样,映射文件不同,但为了清楚,还是稍作区别,其实只是类名改变了下。
类:
package model;

/**
 * Person1 entity
 */

public class Person1 implements java.io.Serializable {
	private Integer id;
	private Address1 address1;
	private String name;
	private String gender;

	/** default constructor */
	public Person1() {
	}

	/** full constructor */
	public Person1(Address1 address1, String name, String gender) {
		this.address1 = address1;
		this.name = name;
		this.gender = gender;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Address1 getAddress1() {
		return this.address1;
	}

	public void setAddress1(Address1 address1) {
		this.address1 = address1;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return this.gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

}



package model;

/**
 * Address1 entity
 */

public class Address1 implements java.io.Serializable {
	private Integer id;
	private String city;
	private String street;
	private Person1 person1;

	/** default constructor */
	public Address1() {
	}

	/** full constructor */
	public Address1(String city, String street, Person1 person1) {
		this.city = city;
		this.street = street;
		this.person1 = person1;
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getCity() {
		return this.city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getStreet() {
		return this.street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	public Person1 getPerson1() {
		return this.person1;
	}

	public void setPerson1s(Person1 person1) {
		this.person1 = person1;
	}

}

映射文件:
Person1.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Person1" table="person1" catalog="study">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <!-- 一般来说采用外键会表现为一对多,参考方为多,被参考方为1,亦即是拥有外键约束的一方为多。但通过在外键上增加唯一性约束,将使得一对多变为一对一 -->
        <many-to-one name="address1" class="model.Address1" lazy="false" cascade="true" unique="true">
            <column name="adress" />
        </many-to-one>
        <property name="name" type="java.lang.String">
            <column name="name" length="16" />
        </property>
        <property name="gender" type="java.lang.String">
            <column name="gender" length="2" />
        </property>
    </class>
</hibernate-mapping>


Address1.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Address1" table="address1" catalog="study">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="city" type="java.lang.String">
            <column name="city" length="40" />
        </property>
        <property name="street" type="java.lang.String">
            <column name="street" length="100" />
        </property>
        <!-- 注意 property-ref属性,是指在person1类中定义address1类作为属性时的属性名称 -->
        <one-to-one name="person1" class="model.Person1" property-ref="address1" />
    </class>
</hibernate-mapping>
分享到:
评论

相关推荐

    hibernate 映射关系学习入门 一对一映射

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate学习入门一对多实体映射源码

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate入门到精通

    - 单向一对一:在单向一对一关联中,一个实体(如`Person`)拥有一个唯一关联的实体(如`IDCard`),`Person`表中包含`IDCard`的外键。在Hibernate中,通过`&lt;one-to-one&gt;`标签并设置`foreign-key`属性来表示。 - ...

    Hibernate 对象关系映射

    本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    Hibernate3.1_学习源码

    案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。

    Hibernate基础和入门:新建表和插入表

    13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...

    图书:Hibernate入门 - 第二版

    7. **一对多、多对一、一对一和多对多关系映射**:深入解析不同类型的关联关系,包括如何在映射文件或注解中配置,以及如何在代码中操作这些关联对象。 8. **缓存机制**:探讨Hibernate的缓存策略,包括一级缓存和...

    hibernate入门简单实例

    15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...

    hibernate入门

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。ORM框架如Hibernate简化了数据持久化的过程,通过将对象模型与数据库模型进行映射,实现了...

    hibernate快速入门

    1. **一对一(OneToOne)**:一个实体对应另一个实体的唯一实例。 2. **一对多(OneToMany)**:一个实体可以有多个相关联的实体实例。 3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多...

    hibernate系列(一)hibernate入门

    Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...

    传智播客李勇hibernate源码1-20课

    14_多对一关联关系的映射与原理分析 15_多对一关联关系的检索与原理分析 16_保存多对一关联关系的更进一步分析 17_一对多关联关系的映射与原理分析 18_一对一主键关联关系的映射与原理分析 19_一对一主键关联...

    MyEclipse+Hibernate快速入门中文版

    - 多种映射策略:支持一对一、一对多、多对多等多种关联关系。 - 对象的持久化管理:可以实现单个对象映射到多个表。 - 支持集合类型的映射。 - 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许...

    java基础入门之Hibernate 入门

    1. **关联映射**:了解一对一、一对多、多对多的关联关系,并学会配置映射。 2. **事务管理**:理解Hibernate的事务处理机制,使用`session.getTransaction()`进行事务控制。 3. **CGLIB和ASM代理**:在无接口的情况...

Global site tag (gtag.js) - Google Analytics