hibernate-mapping元素
可以包含的子元素
class –描述被映射的类
subclass/joined-subclass –在继承关系的映射中会用到
query –将查询语句定义在配置文件中
class元素
常用属性
name –实体类的类名
table –被映射到数据库表的名称
可以包含的常见子元素
id –主键定义
property –属性定义
关系映射定义(一对多、多对一等)
主键-id
被映射的类必须要有一个id定义
Hibernate使用generator类来生成主键
Hibernate自带了很多generator(不同的主键生成策略)
int/long – native
String - uuid
我们也可以定义自己的generator
实现IdentifierGenerator接口
一般情况下不需要实现自己的generator
主键生成策略generator
主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识。
Hibernate内置的主键生成策略
数据库提供的主键生成机制。identity、sequence(序列)。
外部程序提供的主键生成机制。increment(递增),hilo(高低位),seqhilo(使用序列的高低位),uuid.hex(使用了IP地址+JVM的启动时间(精确到1/4秒)+系统时间+一个计数器值(在JVM中唯一)),uuid.string。
其它。native(本地),assigned(手工指定),foreign(外部引用)。
普通属性映射– property
<property name=“property_name”/>
可使用的常见属性如下:
name –对应类的属性名称
type –指定属性的类型,一般情况下可以不用指定,由hibernate自动匹配(可参考文档中的有关说明)
length –指定长度
column –指定属性所对应的数据库字段的名称,如果不指定,就是属性的名称
多对一关联映射-many-to-one
User-Group多个用户属于某个组
public class Group {
privte String id;
private String name;
…..
}
public class User{
private String id;
privte String name;
private Group group;
……
}
<many-to-one name="group"column=“groupid”/>group为关键字,需重命名
生成的DDL语句如下:
create table T_Group (id varchar(255) not null, name varchar(255), primary key (id))
create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime datetime, expireTime datetime, groupid
varchar(255), primary key (id))
alter table User add index FK285FEBC3D18669 (groupid), add constraint FK285FEBC3D18669 foreign key (groupid) references
T_Group (id)
从生成的DDL语句,我们可以知道,实际上是在User表上建立了一个指向Group表的外键关联(在多的一端加入)
重要属性cascade(级联)
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
如:<many-to-one
name=“group” column=“groupid” cascade=“all”/>
无cascade配置的User-Group执行代码
配置:<many-to-one name=“group” column=“groupid”/>
java代码:
Group group = new Group();
group.setName("jkjk");
User user = new User();
user.setName("管理员");
user.setGroup(group);
session.save(user);
执行结果:
抛出org.hibernate.TransientObjectException异常,以上代码中,group对象是一个瞬时对象,user对象引用了一个瞬时对象,所以在保存的时候出现异常
无cascade配置时正确的java执行代码
为避免异常,我们可以需要将group对象保存
Group group = new Group();
group.setName("jkjk");
//执行save操作之后,group对象变成持久化对象的状态
session.save(group);
User user = new User();
user.setName("管理员");
user.setGroup(group);
session.save(user);
添加cascade配置
<many-to-one name="group" column="groupid"cascade="all"/>
下面的代码(最初的代码)
Group group = new Group();
group.setName("jkjk");
User user = new User();
user.setName("管理员");
user.setGroup(group);
session.save(user);
可正确执行。cascade配置,使得hibernate在管理对象的时候,对cascade对象执行了级联操作
一对一关联映射(one-to-one)
两个对象之间是一对一的关系,如Person-IdCard
有两种策略可以实现一对一的关联映射
主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;
<!--
one-to-one 默认开启了cascade属性
one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard
-->
一对一(主键关联映射)
Person类(person-->idcard)
public class Person {
private int id;
private IdCard idCard;
…..
}
IdCard类
public class IdCard {
private int id;
private Person person;
……
}
映射文件
<class name="com.bjsxt.hibernate.Person">
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>person主键来源于idCard属性
</generator>
</id>
….
<one-to-one name="idCard"constrained="true"/>constrained表示加上约束
</class>
<class name="com.bjsxt.hibernate.IdCard">
<id name="id">
<generator class=“native"/>
</id>
….
<one-to-one
name=“person"></one-to-one> idcard-->person
</class>
一对一(唯一外键关联映射)
Mankind类
public class Mankind {
private String id;
private String name;
private Nose nose;
映射文件 一对一外键关联单向是多对一映射的特例,指定unique="true"指定了多的一端唯一
<class name="com.bjsxt.hibernate.Mankind">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<many-to-one name="nose"unique="true"
cascade="all"></many-to-one>
</class>
Nose类
public class Nose {
private String id;
private Mankind mankind;
关联映射
<class name="com.bjsxt.hibernate.Nose">
<id name="id">
<generator class="uuid"/>
</id>
<one-to-one name="mankind"property-ref="nose"></one-to-one>
</class>
one-to-one标签指示Hibernate默认根据主键加载关联对象,外键关联映射中,因为两个实体采用的是Mankind
的外键维护的关系,所以不能指定主键加载Mankind ,而要根据Mankind 的外键(nose)加载,根据主键是无法加载到关联对象的,必须指定property-ref属性,它表示本类(Nose)的主键将会与关联类(Mankind)的此属性(nose)相对应。property-ref指定的值(name)所对应的列(column)就是由本对象关联查询相关对象时的条件(不指定时默认是对方的主键)
一对多关联映射(one-to-many)
在对象模型中,一对多的关联关系,使用集合来表示
比如Classes(班级)和Student(学生)之间是一对多的关系
public class Classes {
private String id;
private String name;
private Set students;
….
public class Student {
private String id;
private String name;
…..
一对多关联映射文件
Classes映射文件
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Classes">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid" ></key>classesid表示字段名字
<one-to-many class="com.bjsxt.hibernate.Student"
/>
表示列来至于com.bjsxt.hibernate.Student这张表
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.bjsxt.hibernate">
<class name="Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" class="Classes" column="classesid"/>
column属性值必须与<key column="classesid" />一致
</class>
</hibernate-mapping>
关于lazy属性
lazy –延迟加载(懒加载),一般用于集合的抓取策略,也就是说只在需要用到的情况下,再发出select语句,将其相关的对象查询出来
set默认lazy属性的值是true,即hibernate会自动使用懒加载策略,以提高性能
举例说明
<set name="students“ lazy=“false”>
<key column="classesid" ></key>
<one-to-many class="com.bjsxt.hibernate.Student" />
</set>
关于inverse属性
inverse –标记由哪一方来维护关联关系(双向关联中会用到)
inverse默认值为false
如果inverse设置为true,表示将由对方维护两者之间的关联关系
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,如果设置成inverse为true,则我们只能从多一端来维护关联关系
注意:inverse属性,只影响数据的存储,也就是持久化
inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应
举例说明
<set name="students“ lazy=“false” inverse=“true”>
<key column="classesid" ></key>
<one-to-many class="com.bjsxt.hibernate.Student" />
</set>
hibernate多对多关联映射
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
分享到:
相关推荐
以下是关于“Hibernate关系映射”的详细解释。 1. 一对一关系映射: Hibernate支持一对一(One-to-One)关系映射,这种关系通常存在于具有唯一性的关联表中。通过在实体类中使用`@OneToOne`注解,我们可以定义一对...
综上所述,这个压缩包提供了关于Hibernate关系映射的全面教程,包括多对多、一对一和一对多的关系配置,以及如何在Spring+Hibernate+Struts环境中应用这些关系。对于想要深入理解Hibernate并提升开发效率的Java...
Hibernate对象关系映射一对多 很基础等文档
hibernate关系映射,1V1,1vN,nVn,单相双相
hibernate关系映射系列1,单向1对1映射,意向Nto1 程序说明:生成mysql数据库,建立DB Browser连接后,用户可在程序中自动生成mysql表,非常简单,适合初学者了解hibernate映射机制,有问题可联系flyallen5@hotmail.com
Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。关系映射XML生成工具,如"Middlegen-Hibernate-r5",则是为了简化这一过程而设计的。这些工具能够自动...
**二、Hibernate关系映射的类型** 1. **一对一(OneToOne)**: 表示一个实体对应另一个实体的唯一实例。这可以通过在两个类中都定义`@OneToOne`注解来实现,并通过`mappedBy`属性指定被引用的一方。 2. **一对多...
Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者
Hibernate4中映射关系图解。
<hibernate-mapping> <class name="com.bjsxt.hibernate.User" table="t_user"> <!-- --> </hibernate-mapping> <hibernate-mapping> <class name="com.bjsxt.hibernate.Group" ...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...
现在我也正在学hibernate,于是我认为这东西对你也有用吧