- 浏览: 72439 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lijingshou:
感觉有学习价值..mark first
java仿QQ源代码 -
wang514674793:
写的很好,谢谢了~~~
Ztree的异步加载子节点简单使用
在hibernate中一对一关联关系映射有两种方式:共享主键和唯一外键。共享主键就是两张表的主键值都用一个值,唯一外键,顾名思义,即是在外键上加上唯一性约束。但无论是哪种方式,如果表中存在主从关系,在使用DAO的save方法保存从对象时,都必须先将主对象属性通过set方法先添加。
比如有2个类:
B主A从,那么,在调用save方法保存A前,必须先用A的set方法将b属性对应的对象添加,否则失败。主对象可以单独保存。判断主从的依据是,数据库的设计(主要的,你设计为主表即为主控方);既是主键又是外键,则为从。被参考的主键所在的表对应的则为主。
因为是整理,所以在说映射之前将一对一关系中的有的东西先说清楚。DAO代码不再附上,仅附上sql脚本和映射文件及对应的类,其实SQL中的外键关系在数据库表中都不用体现,因为有Hibernate映射文件约束,但为了清楚和手动插入数据的完整性,还是加上了。
数据库MySQL5.6,脚本:
一对一关系映射,共享主键方式:
类person为主,adress为从
映射文件
Person.hbm.xml
Adress.hbm.xml
一对一关系映射,唯一外键方式:
类一样,映射文件不同,但为了清楚,还是稍作区别,其实只是类名改变了下。
类:
映射文件:
Person1.hbm.xml
Address1.hbm.xml
比如有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泛型DAO接口,大部分通用都已包括
2014-01-24 13:47 7951过了大半年,来把这个更新下。 Hibernate通用泛型DAO ... -
Hibernate的load()、get()、list()、iterator()方法的区别,求证中
2014-01-24 10:08 1039一级缓存,内部缓存, ... -
[转]hibernate模糊查询
2014-01-23 09:59 893Hibernate中Criteria的完整用法2008年07 ... -
hibernate入门四:多对多关联关系映射
2013-10-16 02:21 847hibernate中多对多关联关系映射和一对多关联关系映射 ... -
[转]hibernate中的inverse和cascade
2013-09-28 15:33 711nverse和cascade是Hibernate映 ... -
hibernate入门三:一对多关联关系映射
2013-09-28 15:08 2108实体之间的一对多关系是很常见的一种关联关系,例如:一个人有 ... -
hibernate入门一:单表操作(单对象操作)
2013-09-03 14:27 778最近开始整理学习 ...
相关推荐
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班
- 单向一对一:在单向一对一关联中,一个实体(如`Person`)拥有一个唯一关联的实体(如`IDCard`),`Person`表中包含`IDCard`的外键。在Hibernate中,通过`<one-to-one>`标签并设置`foreign-key`属性来表示。 - ...
本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。
13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...
7. **一对多、多对一、一对一和多对多关系映射**:深入解析不同类型的关联关系,包括如何在映射文件或注解中配置,以及如何在代码中操作这些关联对象。 8. **缓存机制**:探讨Hibernate的缓存策略,包括一级缓存和...
15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。ORM框架如Hibernate简化了数据持久化的过程,通过将对象模型与数据库模型进行映射,实现了...
1. **一对一(OneToOne)**:一个实体对应另一个实体的唯一实例。 2. **一对多(OneToMany)**:一个实体可以有多个相关联的实体实例。 3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多...
Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...
14_多对一关联关系的映射与原理分析 15_多对一关联关系的检索与原理分析 16_保存多对一关联关系的更进一步分析 17_一对多关联关系的映射与原理分析 18_一对一主键关联关系的映射与原理分析 19_一对一主键关联...
- 多种映射策略:支持一对一、一对多、多对多等多种关联关系。 - 对象的持久化管理:可以实现单个对象映射到多个表。 - 支持集合类型的映射。 - 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许...
1. **关联映射**:了解一对一、一对多、多对多的关联关系,并学会配置映射。 2. **事务管理**:理解Hibernate的事务处理机制,使用`session.getTransaction()`进行事务控制。 3. **CGLIB和ASM代理**:在无接口的情况...