person 类:
package com.jianchen;
public class Person {
private int id;
private String name;
private IdCard idcard;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdcard() {
return idcard;
}
public void setIdcard(IdCard idcard) {
this.idcard = idcard;
}
}
IdCard 类:
package com.jianchen;
public class IdCard {
private int id;
private String cardno;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardno() {
return cardno;
}
public void setCardno(String cardno) {
this.cardno = cardno;
}
}
Person.hbm.xml文件:
<?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>
<class name="com.jianchen.Person" table="t_person" >
<id name="id">
<generator class="foreign" >
<param name="property">idcard</param>
</generator>
</id>
<property name="name" length="10" />
<one-to-one name="idcard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
IdCard.hbm.xml文件:
<?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>
<class name="com.jianchen.IdCard" table="t_idcard" >
<id name="id">
<generator class="native" />
</id>
<property name="cardno" length="10" />
</class>
</hibernate-mapping>
测试代码:
public void testPerson(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idcard = new IdCard();
idcard.setCardno("dffdf");
Person person = new Person();
person.setName("张三");
//在两个对象之间建立关联。
person.setIdcard(idcard);
//在一对一关联映射中,存储Person对象时,其关联对象idcard也别存储
//而不会抛出TransientObjectException异常,因为它默认了级联属性。
session.save(person);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
注:<one-to-one constrained="true">是用来实现主键关联
<many-to-one>是用来实现外键关联
其中<many-to-one unique="true">有一个属性倘若赋值为true则成为唯一外键关联。
hibernate内置的主键生成策略
数据库提供的主键生成机制:identity,sequence(序列)
外部程序提供的主键生成机制.increment(递增),hilo(高低位),seqhilo(使用序列的高低位),uuid.hex
(使用了ip地址+jvm的启动时间(精确到1/4秒)+系统时间+一个计数器值(在jvm中唯一)),uuid.string
其他:native(本地),assigned(手工指定),foreign(外部引用)
映射的实质就是把内存中对象之间的引用转换为数据库中的关系。
many-to-one就是外键引用。
一对一:
主键关联映射
唯一外键关联映射
在一对一主键关联映射中,
默认了级联属性。
Hibernate 一对一外键关联映射(双向关联)
双向关联需要在另外一端(IdCard)端添加<one-to-one>标签,
指示hibernate如何加载其引用对象,默认情况下会根据主键匹配进行加载Person,
因为外键关联映射中,两个实体的关系是由person的外键idcard维护的,所以不能指定使用person的主键对person进行加载,而要根据person的外键idcard进行加载,如<one-to-one name="person" property-ref="idcard"/>
hibernate一对多单向关联映射
这种映射的本质是利用了多对一的关联映射的原理
多对一关联映射:是在多的一端加一个外键维护多指向一的关联引用
一对多关联映射:是在多的一端添加一个外键维护一指向多的关联引用
也就是说:一对多和多对一的映射策略是一致的,只是站的角度不同
缺点:
更新student表中的classesid字段时,需要对每一个student发出一个update的sql,来更新classesid
如果将t_student表中的classesid设置为非空,则不能保存student数据,因为关系是由classesid来维护的,在保存student时,还没有对应的classesid被生成。
Hibernate 一对多双向关联映射
一对多双向关联映射的方法:
在一一端:
在集合标签里面使用<key>标签来表明需要在对方的表中添加一个外键指向一一端。
在多一端:
使用<many-to-one>标签来映射
需要注意:<key>标签所指定的外键字段名需要与<many-to-one>标签定义的外键字段名一致,否则便会造成引用数据的丢失!
如果从一端来维护一对多双向关联的关系,hibernate会发出多余的update语句,所以一般的情况下,我们便会从多一端来维护其关联关系。
lazy策略可以用在:
<class>标签上,可以取值true/false
<property>标签上,可以取值true/false,这个特性需要类增强
<set>/<list>等集合上,可以取值为true/false/extra
<one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy
重要的概念:
1,lazy的概念,指在需要的时候才发出sql;
2,lazy策略只是在session打开期间才是有效的
注意:hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属性。(指的是那些普通属性,有property设置的属性。对于set无影响。)
hibernate集合属性的懒加载策略:
在集合属性上,可以配置懒加载策略,取值为:true/false/xetra
true:默认取值,他的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据 。
false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比价聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的sql语句,以便获得需要的值,只有子啊 真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。
****在class标签上配置的lazy属性不会影响到关联对象!!!!!
}
分享到:
相关推荐
Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...
Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...
【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个压缩包包含了丰富的Hibernate学习资源,旨在帮助开发者深入理解和熟练掌握这一强大的...
《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...
【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...
HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...
在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...
Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...
Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...
标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...
标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...
包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....
Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...
Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...
Hibernate3是Hibernate的第三个主要版本,发布于2005年,它提供了一种将Java对象与数据库表之间的映射方式,使得数据库操作更加面向对象。该框架支持多种数据库,包括MySQL、Oracle、SQL Server等,并且通过JDBC API...
Hibernate 是一个著名的开源对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。这个“hibernate_3.2官方开发包”包含了所有你需要开发基于...