`

Hiberante part 9:一对一关系映射

 
阅读更多

 

一个男人对应一个女人,一个女人只能属于一个男人

 

方式一:外键映射

Male类

public class Male implements Serializable {
	private Integer id;
	private String name;
	private Integer age;
	private Female female;
}

 Male.hbm.xml,在male表中引入外键列female_id

<?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>
	<class name="rock.lee.bean.Male" table="male" catalog="test">
		<id name="id" column="id" type="int">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="java.lang.String"></property>
		<property name="age" column="age" type="int"></property>
		<many-to-one name="female" class="rock.lee.bean.Female"  unique="true" column="female_id"></many-to-one>
	</class>
</hibernate-mapping>

 
对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加 many-to-one 元素。为 many-to-one元素增加 unique=“true” 属性来表示为1-1关联,并用name属性来指定关联属性的属性名

 

Female类

public class Female implements Serializable {
	private Integer id;
	private String name;
	private Integer age;
	private Male male;
}

 Female.hbm.xml

<?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>
	<class name="rock.lee.bean.Female" table="female" catalog="test">
		<id name="id" column="id" type="int">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="java.lang.String"></property>
		<property name="age" column="age" type="int"></property>
		<one-to-one name="male" class="rock.lee.bean.Male"  property-ref="female"></one-to-one>
	</class>
</hibernate-mapping>

 另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段,也就是指定female在male表中的外键

在hibernate.cfg.xml中配置加载hbm文件

	<mapping resource="rock/lee/bean/Male.hbm.xml" />
	<mapping resource="rock/lee/bean/Female.hbm.xml" />

 测试保存

	@Test
	public void testOntToOne01() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Male male = new Male("小明", 20);
		Female female = new Female("孙艺珍", 33);
		male.setFemale(female);
		female.setMale(male);
		
		session.save(male);
		session.save(female);
		
		transaction.commit();
		session.close();
	}

 测试惟一性:

mysql> select * from female;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 孙艺珍       |   33 |
+----+--------+------+
1 row in set (0.00 sec)

mysql> select * from male;
+----+------+------+-----------+
| id | name | age  | female_id |
+----+------+------+-----------+
|  1 | 小明    |   20 |         1 |
+----+------+------+-----------+
1 row in set (0.00 sec)

 小明和孙艺珍离婚了,娶了孙艺珍的闺蜜林允儿

	@Test
	public void testOntToOne02() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Male male = (Male) session.get(Male.class, 1);//查询小明
		Female female = new Female("林允儿", 26);
		male.setFemale(female);
		session.save(male);
		session.save(female);
		
		transaction.commit();
		session.close();
	}

 小明再婚成功

mysql> select * from female;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 孙艺珍       |   33 |
|  2 | 林允儿      |   26 |
+----+--------+------+
2 rows in set (0.00 sec)

mysql> select * from male;
+----+------+------+-----------+
| id | name | age  | female_id |
+----+------+------+-----------+
|  1 | 小明    |   20 |         2 |
+----+------+------+-----------+
1 row in set (0.00 sec)

 几年后,林允儿看上了宋祖德,林允儿即不想离婚,又想和宋祖德在一起

	@Test
	public void testOntToOne03() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Female female = (Female) session.get(Female.class, 2);
		Male male = new Male("宋祖德",55);
		male.setFemale(female);
		session.save(male);
		session.save(female);
		
		transaction.commit();
		session.close();
	}

 会抛出异常

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'female_id'

 可以对感情不忠,但不能重婚

 

逗逼一下:

 

	@Test
	public void testOntToOne04() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Female female = (Female) session.get(Female.class, 1);
		Male male = new Male("博主",27);
		male.setFemale(female);
		session.save(male);
		session.save(female);
		
		transaction.commit();
		session.close();
	}
 

You To Me & Me To You Ⅰ

mysql> select * from female;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 孙艺珍       |   33 |
|  2 | 林允儿      |   26 |
+----+--------+------+
2 rows in set (0.00 sec)

mysql> select * from male;
+----+------+------+-----------+
| id | name | age  | female_id |
+----+------+------+-----------+
|  4 | 博主     |   27 |         1 |
+----+------+------+-----------+
1 row in set (0.00 sec)
 

 



 

永远的初恋情人

 

方案二:主键映射

female表的主键是引用male的主键

Male.hbm.xml

	<hibernate-mapping>
		<class name="rock.lee.bean.male" table="male">
			<id name="id">
				<generator class="native"></generator>
			</id>
			<property name="name"></property>
			<one-to-one name="female" class="rock.lee.bean.Female"></one-to-one>
		</class>
	</hibernate-mapping> 

 Female.hbm.xml

	<hibernate-mapping>
		<class name="rock.lee.bean.Female" table="female">
			<id name="id">
				<generator class="foreign">
					<param name="property">company</param>
				</generator>
			</id>
			<property name="info"></property>
			<one-to-one name="male" class="rock.lee.bean.Male" constrained="true"></one-to-one>
		</class>
	</hibernate-mapping> 

 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的那个属性作为 “对方”
采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 属性还应增加 constrained=“true” 属性;另一端(company)增加one-to-one元素映射关联属性。

constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

 

  • 大小: 226.6 KB
分享到:
评论

相关推荐

    Hibernate双向一对一关联映射(XML版)

    在这个“Hibernate双向一对一关联映射(XML版)”的主题中,我们将深入探讨如何通过XML配置文件实现两个实体之间的一对一关系。 首先,我们需要理解一对一关联的概念。在数据库中,一对一关联意味着两个表中的每一...

    hiberante4.2.3-part2

    hiberante4.2.3-part2

    hiberante4.2.3-part01

    9. **映射文件与注解**:Hibernate支持XML映射文件和注解两种方式来定义实体和数据库之间的映射关系。注解方式更为简洁,更受现代项目欢迎。 10. **实体状态**:Hibernate区分了四种实体状态:瞬时态、持久态、游离...

    hiberante-4.2.3-part3

    hiberante-4.2.3-part3

    hiberante-4.2.3-part4

    hiberante-4.2.3-part4

    DAO层中对Hiberante

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...

    hibernate使用主键关联的一对一关系

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    hiberante 源码 配置资料

    Hibernate,作为一款强大的对象关系映射(ORM)框架,深受Java开发者喜爱。本文将结合"hibernate源码"和"hibernate配置"两个核心主题,深入探讨Hibernate的工作原理及配置细节,帮助读者从源码层面提升对Hibernate的...

    hiberante3 注解帮助文档

    hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档

    hiberante第一章.docx

    Hibernate 是一个流行的开源 Java ORM(对象关系映射)框架,它旨在简化数据库操作,通过提供一种面向对象的方式来与数据库交互。它建立在 JDBC(Java Database Connectivity)之上,对 JDBC 进行了轻量级的封装,但...

    Hiberante3.jar + API

    Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发者在处理数据库操作时的得力助手。本篇将深入探讨Hibernate3.jar及其API,帮助开发者更好地理解和运用这个库。 一、Hibernate3.jar介绍 Hibernate3....

    spring+mvc+hiberante

    Hibernate 是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,将数据库交互抽象为 Java 对象。 在“spring+mvc+hibernate”整合中,我们首先会设置 Spring 的配置,这通常涉及到定义 beans 和他们的依赖...

    springmvc hiberante

    Spring MVC 和 Hibernate 是两个在Java Web开发中广泛使用的框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用和管理数据库操作的对象关系映射(ORM)工具。在实际项目中,这两个框架的集成能提供...

    hiberante annotations reference.pdf

    Hibernate是一个开源的对象关系映射(Object-Relational Mapping,ORM)框架,它允许开发人员将Java对象映射到数据库表中,简化了数据访问层的开发工作。Hibernate注解则是用于在实体类上声明映射元数据的一种方式,...

    hiberante5.0.7安装jar包

    1. **hibernate-core.jar**: 这是Hibernate的核心库,包含了对ORM(对象关系映射)的主要实现,包括实体管理、查询语言(HQL)和事件处理等。 2. **hibernate-entitymanager.jar**: 提供了JPA(Java Persistence ...

    hiberante中文帮助文档

    9. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多等各种关联映射,如`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`,使得对象之间的关系能自然地体现在数据库设计中。 10. **懒加载和...

    Struts+Hiberante+Sprint 框架整合

    开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root

    最新springboot2hiberante5项目

    最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....

    Hiberante 有关jar包

    Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分

Global site tag (gtag.js) - Google Analytics