Hibernate关联映射

合集下载

Hibernate

Hibernate

3.Hibernate映射类型
在hbm.xml中指定的type属性值.Java属性值<--映射类型-->表字段值映射类型负责属性值和字段值之间相互转化。type可以指定两种格式:
1)Java类型 例如:ng.String
*2)Hibernate类型
字符串:string
i.清除DAO中关闭session的代码
j.测试Struts2+Hibernate程序
--根据数据表编写POJO
--定义POJO和表的映射文件 [POJO类名].hbm.xml (在hibernate.cfg.xml中采用<mapping>元素定义)
--采用Hibernate API操作
//1.按主键做条件查询
session.load(查询类型,主键值);
session.get(查询类型,主键值);
//2.添加,根据hbm.xml定义
//自动生成主键值
session.save(obj);
//3.更新,按id当条件将obj属性
//更新到数据库
session.update(obj);
//4.删除,按id当条件删除
session.delete(obj);
**4.主键生成方式
Hibernate框架提供了一些内置的主键值生成方法。使用时通过hbm.xml文件<id>元素的<generator>指定。
*1)sequence
采用指定序列生成主键值。适用Oracle数据库。
<generator class="sequence"><param name="sequence">序列名</param></generator>

hibernate配置

hibernate配置
属性可以是update、create和drop-create三个值。
目录
1 Hibernate概述 2 第一个Hibernate程序 3 Hibernate的配置文件 4 深入理解持久化对象 5 Hibernate的映射文件 6持久化对象 如果PO 实例与Session实例关联起来,且该实例关联到数据库的记录
脱管对象 如果PO实例曾经与Session实例关联过,但是因为Session的关闭等原 因,PO实例脱离了Session 的管理
Hibernate全面解决方案架构解释
事务(Transaction) 代表一次原子操作,它具有数据库事务的概念 但它通过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA 事务中隔离开。 一个Session 之内可能包含多个Transaction对象。 所有的持久化操作都应该在事务管理下进行,即使是只读操作。
管态,对该对象操作无须锁定数据库,不会造成性能的下降。
持久化对象的状态迁移
持久化实体: 1、Serializable save(object obj) 将对象变为持久化状态 2、void persist(object obj) 将对象转化为持久化状态 3、Serializable save(object obj,object pk) 将obj对象转化为持久化状态,该对象保存到数据库,指定主键值 4、void persist(object obj,object pk) 也加了一个设定主键
Hibernate工作原理
Configuration cfg = new Configuration().configure();
开始
启动hibernate
构建Configuration 实例,初始 化该实例中的所有变量

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
• 增加山南区下属的三个街道:“和平路” 、“八一路”和“五四大道”
在many一方删除数据1
• 删除“五四大道”
inverse设为true,由many一方删除 从one一方去“删除”, Hibernate只是执行了 问题出在配置文件上 update语句。还是未删 没有配置set节点的inverse属性 除成功! 根本没有执行 Delete语句,数据 没有被删除!
– 配置Hibernate多对多关联,实现某OA系统项 目和人员对照关系的管理
本章目标
• 掌握单向many-to-one关联 • 掌握双向one-to-many关联 • 掌握many-to-many关联
实体间的关联
• 单向多对一
tblJd.getQx().getQxname();
• 单向一对多
TblJd jd = (TblJd)tblQx.getJds().get(0); jd.getJdname(); tblQx.getJds.add(jd);
小结
• 在租房系统中,房屋信息(Fwxx)与用户 (User)间也是多对一关系。如何配置映 射文件,使之可以通过下面的代码输出房 屋信息和发布该信息的用户名称? Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);
System.out.println( fwxx.getTitle() + "," + fwxx.getUser.getUname());
inverse是“反转”的意思,表示关联关系的控制权。 为true,表示由对方负责关联关系的添加和删除; 执行了delete语句, 为false,表示由自己负责维护关联关系。 删除成功
• 在many一方删除数据的正确做法:

Hibernaet的作用

Hibernaet的作用

第一:数据库连接不需要我们自己来管理,如打开和关闭(优点吧)第二:Hibernate对原来的SQL语句进行了封装,以前写很多SQL语句,现在你在保存的时候直接可以用SA VE(对象)来实现了。

(节省代码吧)第三:原来是对表操作,现在是对对象操作,想法上是不是更好呢?都是对象。

Hibernate优点(1) 对象/关系数据库映射(ORM)它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想(2) 透明持久化(persistent)带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。

这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。

一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。

(例如,用作跟表示层打交道的数据传输对象。

)(3) 事务Transaction(org.hibernate.Transaction)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。

它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。

某些情况下,一个Session之内可能包含多个Transaction对象。

尽管是否使用该对象是可选的,但无论是使用底层的API 还是使用Transaction对象,事务边界的开启与关闭是必不可少的。

(4) 它没有侵入性,即所谓的轻量级框架(5) 移植性会很好(6) 缓存机制,提供一级缓存和二级缓存(7) 简洁的HQL编程2. Hibernate缺点(1) Hibernate在批量数据处理时有弱势(2) 针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate1.strutsstruts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。

hibernate中restrictions类表示不等于的方法_概述说明

hibernate中restrictions类表示不等于的方法_概述说明

hibernate中restrictions类表示不等于的方法概述说明1. 引言1.1 概述本文旨在介绍Hibernate框架中restrictions类表示不等于的方法。

Hibernate 是一个Java持久化框架,它提供了一种对象-关系映射(ORM)的解决方案,帮助开发人员将Java对象与数据库表进行映射。

其中,在使用Hibernate进行查询操作时,我们经常需要使用Restriction类来构建查询条件。

Restrictions类提供了多种方法来创建查询语句的条件表达式,例如相等、大于、小于等。

然而,在实际开发中,不等于的查询条件也是经常用到的。

本文将重点介绍Restrictions类中表示不等于的方法,以便读者能更加灵活地运用Hibernate框架来满足自己的需求。

1.2 文章结构本文将分为五个部分进行说明。

首先是引言部分,对文章进行概述和介绍。

接下来是正文部分,详细阐述了Hibernate框架和其使用restrictions类进行查询操作的背景和意义。

紧接着是第三部分,我们将专门讲解Restriction类中表示不等于的方法。

通过这些方法,读者可以清晰了解如何在查询中使用不等于条件来过滤数据。

在第四部分中,我们将总结前面所述内容,并给出一些重点要点。

这些要点涵盖了使用Restrictions类表示不等于的方法的注意事项和技巧。

最后,第五部分是参考文献及来源,提供了一些额外的参考资料供读者进一步学习和了解。

1.3 目的本文的目标是帮助读者扩展对Hibernate框架中Restrictions类的理解,并能够熟练运用不等于方法来构建更加精确的查询条件。

通过学习本文,读者将能够更好地利用Hibernate框架进行数据查询,并在各种场景下灵活应用不等于条件达到预期效果。

相信对于有关Hibernate的开发人员来说,本文将是一个很有价值的参考资料。

2. 正文在Hibernate中,Restrictions类是用于创建查询条件的关键类之一。

hibernate最精细总结 java

hibernate最精细总结 java

Hibernate总结注:重点讲解关联映射总结人:张焕邮箱:zhang343489603@欢迎交流讨论。

目录1)核心接口简介2)Hibernate版本更新情况3)Hibernate关联映射4)简单属性查询5)Hibernate与延迟加载6)hibernate 中Criteria 的使用介绍7) Hibernate程序性能优化Hibernate优点:1、封装了jdbc,简化了很多重复性代码。

2、简化了DAO层编码工作,使开发更对象化了。

3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。

4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。

所以说它是一个轻量级框架。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web 应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

1)核心接口简介:Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。

这6个核心接口在任何开发中都会用到。

通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

下面对这6个核心接口分别加以介绍。

Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。

)。

但需要注意的是Session对象是非线程安全的。

同时,Hibernate的session不同于JSP应用中的HttpSession。

关系映射

关系映射
单向关联Person----->IdCard
T_person --------------------------------------Id name --------------------------------------1 张三 2 李四 T_idCard --------------------------------------Id cardNo --------------------------------------1 1234567890 2 2345678901
One2One fk1
<class name="com.sinoest.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class>
many2one
public class User { private int id; private String name; private String name; private Group group; public int getId() { return id; } …. } } public int getId() { return id; } public void setId(int id) { this.id = id; } …. Public class Group{ prlass Classes { private int id; private String name; private Set students; public int getId() { return id; } public void setId(int id) { this.id = id; } ……. public class Student { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; }

第8章 NHibernate高级数据映射和查询

第8章 NHibernate高级数据映射和查询

第8章 NHibernate高级数据映射和查询在NHibernate中,实体映射以及高级查询是两个比较重要的模块。

实体映射用来实现代码对象与数据库对象的复杂映射关系。

而高级查询中,通过查询规则和过滤等接口,实现对数据的查询操作。

8.1 实体映射实体映射是指多个对象或者多个数据表之间的一种关系。

在NHibernate中,实体映射包括一对一、多对一以及多对多三种映射模式。

本节中通过实例逐一介绍这三种实体映射。

在各个实例中,需要创建对于映射的数据表。

注意:在NHibernate中,不同的业务场景需要采用不同的映射方案,而对于不同的映射,配置文件也会相应采用不同的配置键。

【本节数据库建库脚本参考:\示例代码\C12\CreateTable.sql】8.1.1 一对一映射在数据库中的两个表中,通过某一字段进行关联,该字段是两个表的主键。

说明:一对一的映射关系如人员表和人员信息详细表信息,人员主表介绍了人的基本信息,而人员子表信息介绍了一些辅助的信息。

但二表都是描述相同的一个实体。

本节实例中,通过人员基本信息表和人员辅助信息表来描述一对一的映射关系。

对应的数据库表之间的关系如图8.1所示。

图8.1 一对一映射数据表关系下面通过实例介绍如何在程序中实现一对一的映射关系。

【本节示例参考:\示例代码\C12\NHMappingOne2One】(1)创建实例数据库和实例表,对应的SQL创建脚本如下代码所示。

说明:该SQL脚本是用来创建后续几种映射对应的数据库表结构,由于映射需要针对不同的业务场景,所以下面表结构会根据不同映射设计出来的。

USE master;GOIF DB_ID (N'NHDemo') IS NOT NULLDROP DATABASE NHDemo;GOCREATE DATABASE NHDemo;GOUSE [NHDemo]GO/****** Object: Table [dbo].[Person] Script Date: 07/13/2007 13:32:55 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[Person]([PersonId] [int] IDENTITY(1,1) NOT NULL,[Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED(ASC[PersonId])WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_PADDING OFFUSE [NHDemo]GO/****** Object: Table [dbo].[PersonDetailInfo] Script Date: 07/13/2007 13:33:02******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[PersonDetailInfo]([PersonId] [int] NOT NULL,[Address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,CONSTRAINT [PK_PersonDetailInfo] PRIMARY KEY CLUSTERED([PersonId] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO ALTER TABLE [dbo].[PersonDetailInfo] WITH CHECK ADD CONSTRAINT[FK_PersonDetailInfo_Person] FOREIGN KEY([PersonId]) REFERENCES [dbo].[Person] ([PersonId])GO ALTER TABLE [dbo].[PersonDetailInfo] CHECK CONSTRAINT [FK_PersonDetailInfo_Person](2)创建一个控制台项目,命名为NHMappingOne2One 。

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率 Enhancing Development Efficiency with Hibernate a LightweightObject/Relational Mapping Technology谢挺 周维民(上海大学机电工程与自动化学院,上海 200072)摘 要 Hibernate是一种轻量对象关系映射技术。

文章通过实例,介绍了Hibernate的一些关键特性,并阐述了该技术的一些局限性。

关键词 Hibernate 对象关系映射企业级JavaBeans 持久化Abstract Hibernate is a lightweight Object/Relational Mapping(ORM) technology. Some key features of Hibernate are illustrated, and some limits of this technology are expounded.Keywords Hibernate Object/Relational Mapping (ORM) EJB Permanence0 引言随着internet的发展,应用服务程序已经从集中式、C/S模式过渡到B/S、分布式模式;无论是用户或是供应商都迫切希望缩短开发周期、提高开发效率,Hibernate应运而生。

1 Hibernate简介Hibernate是一个面向Java环境的对象/关系数据库映射工具。

对象/关系数据库映射(Object/Relational Mapping , ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。

Hibernate不仅提高Java类到数据库的映射,还提供数据查询和获取数据的方法。

Hibernate在英语中的意思是“冬眠”,顾名思义它使得商务逻辑的开发和数据库最大程度地分离,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

Hibernate_映射配置文件详解

Hibernate_映射配置文件详解
–hibernate.properties –hibernate.cfg.xml
Prepared by TongGang
hibernate.cfg.xml的常用属性
• • • • • • • • • connection.url:数据库URL ername:数据库用户名 connection.password:数据库用户密码 connection.driver_class:数据库JDBC驱动 show_sql:是否将运行期生成的SQL输出到日志以供调试。取 show_sql 值 true | false dialect:配置数据库的方言,根据底层的数据库不同产生不 dialect 同的sql语句,Hibernate 会针对数据库的特性在访问时进行 优化。 hbm2ddl.auto:在启动和停止时自动地创建,更新或删除数据 hbm2ddl.auto 库模式。取值 create | update | create-drop resource:映射文件配置,配置文件名必须包含其相 mapping resource 对于根的全路径 connection.datasource :JNDI数据源的名称
• Class:定义一个持久化类 Class: • name (可选): 持久化类(或者接 (可选): 持久化类( 可选 口)的类名 • table (可选 - 默认是类的非全限 (可选 定名): 定名): 对应的数据库表名 • discriminator-value (可选 - 默 discriminator(可选 认和类名一样): 认和类名一样): 一个用于区分不 同的子类的值,在多态行为时使用。 同的子类的值,在多态行为时使用。 它可以接受的值包括 null 和 not null。 null。
Prepared by TongGang

Hibernate注释大全

Hibernate注释大全
inverseJoinColumns = @JoinColumn( name="monkey_id")
)
public Set<Monkey> getTrainedMonkeys() {
...
}
@Entity
public class Monkey {
... //no bidir
用 cascading 实现传播持久化(Transitive persistence)
cascade 属性接受值为 CascadeType 数组,其类型如下:
? CascadeType.PERSIST: cascades the persist (create) operation to associated entities persist() is called or if the entity is managed 如果一个实体是受管状态,或者当 persist() 函数被调用时,触发级联创建(create)操作。
@SecondaryTable(name="Cat2", uniqueConstraints={
@UniqueConstraint(columnNames={"storyPart2"})})
})
public class Cat implements Serializable {
...
}
public class MyDao {
doStuff() {
Query q = s.getNamedQuery("night.moreRecentThan");
q.setDate( "date", aMonthAgo );

Hibernate 考试题

Hibernate 考试题

Hibernate 考试题一.填空题:1. 对象关系映射(ORM)的基本原则是:类型(class)映射(),属性(property)映射(),关联关系(association)映射(),类型的实例或对象(instance | object)映射()。

2. Hibernate应用通常由四个部分组成,它们是使用Hibernate API的程序和(、、)。

3. Hibernate应用缺省的XML格式的配置文件名是(), 放置在()下;该配置文件的根元素是(),根元素的子元素是();配置数据库方言的属性名是();配置数据库连接的四种属性名是(、、、);配置映射资源的元素是(),如果映射用XML文件表示,用属性()表示,如果映射用标注(annotation)表示,用属性()表示。

4. Hibernate XML映射文件的根元素是();此根元素下主要的子元素是();映射实体类中表示主键的属性的元素是();映射实体类中普通属性的元素是();映射一对一关联关系的元素是();映射多对一关联关系的元素是();表示多对多关系用集合元素,这些集合元素是();描述外键用元素(); 如果一个类型不是实体,但它是某个实体的组成部分,我们用元素()表示;在描述继承关系时,如果用一张表对应整个类层次结构子类型用元素()描述,如果每个子类型对应各自的表子类型用()描述,如果只有真正的可实例化的子类型才对应表则子类型可用元素()或元素()描述;代表双向关联关系时表示是否维护表中外键关系的属性名是();代表级联操作的属性名是();使用乐观锁时我们通常会在实体类型中增加一整型或日期型的属性,在影射文件中用元素(或)描述。

5. 在Hibernate XML影射文件中描述主键生成机制用元素(),其属性描述了主键的生成策略,至少写出三种策略名(、、)。

6. 在Hibernate XML影射文件中级连操作的属性值至少写出三个(、、)。

7. 在Hibernate XML影射文件中描述HQL语句所用元素为()。

Hibernate备课笔记

Hibernate备课笔记

Hibernate笔记:作者:胡晟源QQ:13128377811. hibernate不能删除全是非空记录表记录。

org.hibernate.PropertyValueException: not-null property references a null or transient value: 在hbm.xml里面写了not-null=“true”,至于什么原因,目前正在寻找。

2.Hql语句:form+对象名。

后面的名字必须和javabean类类名相同。

3配置Myeclipse连接数据库,使之自动生成hibernate.cfg.xml和javabean类。

第一步:成功连接数据库。

第三步:新建一个Web工程项目。

选中该项目然后:MyEclipse-->Project--->add Hibernate Capabilities。

操作之后会出现如下界面:选中myhibernate这个项目。

然后点击:一:Myeclipse二:project capabilities三:add Hibernate Capabilities. 第二步:第三步:第四步:对于这步中,我选中去掉自动生成的HibernatesessionFactory工具类,该工具类就是一个回去Session的单例。

完成后,打开项目就可以看到:第五步:重新回到MyEclipse Database Exploere界面。

选中刚刚配置的SQLServerDriver,右击选中open connection,完成后就会出现如下界面:第六步:在dbo-->table中选中相应的表,右击选中Hibernate Reverse Engineering。

如上。

然后出现:第七步:第八步:4.查询一列:返回的是:List<Object>,查询多列:返回的是List<object[]>数组集合。

●(increment)并发问题。

hibernate的manytoone和onetomany用例 -回复

hibernate的manytoone和onetomany用例 -回复

hibernate的manytoone和onetomany用例-回复Hibernate是一个Java的持久化框架,常用于开发数据访问层的代码。

它提供了一种简化数据库操作的方法,可以通过对象和关系数据库进行交互。

在Hibernate中,常用的关系映射包括many-to-one和one-to-many。

本文将通过详细讲解这两种关系映射的用例来帮助读者更好地理解和使用Hibernate。

首先,我们来了解一下many-to-one关系映射。

这种映射关系表示一个实体对象(通常是较"多"的一方)可以与另一个实体对象(通常是较"一"的一方)建立多对一的关系。

在关系数据库中,这种关系通过外键实现。

在Hibernate中,我们可以通过注解或XML配置来映射这种关系。

假设我们要建立一个简单的图书和作者的many-to-one关系映射。

一个作者可以写多本图书,而一本图书只能由一个作者所写。

我们先创建一个Author类和一个Book类。

Author类包含作者的姓名、年龄等属性,并与多个Book对象建立关联,通过"books"字段来表示与图书的关系。

Book 类包含图书的名字、出版日期等属性,并通过"author"字段与一个Author 对象建立关联,表示与作者的关系。

javapublic class Author {private Long id;private String name;private int age;private List<Book> books;省略getter和setter方法}public class Book {private Long id;private String name;private LocalDate publishDate;private Author author;省略getter和setter方法}在Author类中,我们可以使用OneToMany注解来建立与Book对象的关联,并通过设置cascade属性来实现级联操作。

one-to-one

one-to-one
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"/hibernate-mapping-3.0.dtd">
</class>
</hibernate-mapping>
Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hiber">
<class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>

JSP考试试题

JSP考试试题

JSP考试试题一、填空1.在MVC模式下,m代表模型,V代表视图,C代表控制器。

2.struts2有2个很重要的配置文件,分别是struts.properties和struts.xml3.持久化层,对象的状态有临时状态、持久化状态、离线状态。

4.spring通过setter方法实现依赖注入。

如果冬眠时有相应的分数。

5.框架数据库hbm。

全局配置文件是hibernate cfg。

xml6.在struts2实现的mvc框架中,action类是包含了getter和setter方法的控制器类,负责存储数据/状态并且执行逻辑处理,控制应用程序的流程7.Hibernate是一个ORM框架,它封装了JDBC。

通过这个框架,开发人员可以以面向对象的思维方式操作数据库8.spring缺省的全局配置文件名为applicationcontext.xml9.spring的通知类型包括前通知、后返回通知、抛出通知和环绕通知。

二、选择题1.MVC设计模式的目的是(c)a:使程序结构更清晰;B:为了更好地维护项目c:保证视图和模型的隔离d:逻辑上独立的视图、模型和控制器2.以下关于ssh框架说法正确的是(d)a:struts属于web层,负责处理业务逻辑b:Hibernate属于业务层,可以操作数据库。

C:spring属于持久层,是MVC设计模式的实现。

D:以上说法是错误的3.以下选项,不在struts2的配置文件中配置的是(c)a:formbean配置信息b:action转发路径c:Actionservlet配置信息D:Struts引用的资源文件4.下面关于struts报错机制说法正确的是(a)a:强制使用国际化b:错误信息保存在会话中c:使用标签显示错误信息d:也可以使用显示错误信息5.在三层结构中,数据访问层的职责是(b)a:定义实体类b:数据的增删改查操作c:业务逻辑的描述d:页面展示和控制转发6.下面关于hibernate的说法,错误的是(c)a:hibernate是一个“对象―关系映射”的实现b:hibernate是一种数据持久化技术c:hibernate是jdbc的替代技术d:使用hibernate可以简化持久层的编码7.在hibernate关系映射配置中,inverse属性的含义是(b)a:定义在节点上,声明要负责关联的维护b:声明在节点上,声明要对方负责关联的维护c:在节点上定义,声明对方负责维护关联D:在节点上声明,声明其负责维护关联8.关于spring的说法错误的是(c)a:通过setter方法实现依赖注入b:它支持hibernate并简化了hibernate编码。

Hibernate框架ORM常见数据关联分析

Hibernate框架ORM常见数据关联分析
统中常见的一种关联关系。多对多数据关联可 以看做是
2 . 多方对象插入 。( 1 ) 子表对应 的h b m映射文件 中的
外键字段 “ n o t . n u l l ”属性为f a l s e t  ̄ - , j " 。多方 对象中 的一 方对象属性为空时 ,子表正常插入 ,且 只插入子表 ;多 方对象中的一方对象 为瞬态时 ,会报 “ n o t . n u l l p r o p e t r y
A C A DE MI C R E S E A R C H 学术 研 究
H i b e r n a t e 框架O R M常见数据关联分析
◆ 郭 朗
摘 要 :本 文 深入探 讨 了Hi b e r n a t e 轻 量 级 oRM框 架 的数 据 关联 原 理 ,对 该 框 架
在一对多数据关联 中出现的各种 问题进行 了分析 ,并提 出了解 决方案 。
键 ;多方对象中的一方对象态为持久态时 ,能插入多方 对象到子表 :A可以通过先插入一个父表对象或者查询 父表得到一个一方的持久化对象 。B以上成功级联插入
的情 况 均 是 在 c a s c a d e =“ t r u e ” 属 性 下 完 成 的 ,如 果 该
时 ,此时表示s E T 集合中有子表的对象。插人隋况如下 :
①当子表对应的h b m映射文件 中的外键字段n o t . n u l l
属性设置为 t r u e ,此时如果一方S E T 集合 中的多方对象 的外键为空 ,插入会 出 “ n o t . n u l l p r o p e r t y r e f e r e n c e s a
n u l l o r t r a n s i e n t v a l u e :错误” ,此错误为H i b e r n a t e 检查

一对一的实体映射实现

一对一的实体映射实现

(2)对数据库表的设计要求
在主动方的数据库表中应该有被动方的主键作为外键。 在主动方的数据库表中应该有被动方的主键作为外键。
(3)在映 射配置文 件中中利 用<many<manytoto-one> 标签来说 明关系 注意<many to-one>标签时 加上“unique”属性来设 <many标签时, (4)注意<many-to-one>标签时,加上“unique 属性来设 定为具有唯一性约束 具有唯一性约束。 定为具有唯一性约束
(2)命名规则:类名.hbm.xml 命名规则:类名.hbm. 本示例中的EBook hbm.xml映射文件的内容 EBook. (3)本示例中的EBook.hbm.xml映射文件的内容
9、编程基于 Hibernate的DAO组 Hibernate的DAO组 件以进行数据的访 问操作, 问操作,详细的代 码请见文档。 码请见文档。
--外键 外键” 6、 “主--外键”的实 现过程
(1)在主动方所在的持久 类中加入一个被动方类 的对象声明 (2)在主动方类的映射文 件中利用<many to<many件中利用<many-to-one> 标签表示关联关系
详细的实现过程请见后文
Web应用中实现本 一对一” 应用中实现本“ 二、在Web应用中实现本“一对一”的关联示例
一对一” 一、 “一对一”的关联映射原理 1、一对一关联的实现方案 一对一关联在hibernate hibernate中有两种方式 (1)一对一关联在hibernate中有两种方式
主键关联 唯一外键关联
主键关联的实现原理: 2、主键关联的实现原理:基于主键关联的单向一对一关联 通常使用一个特定的id生成器foreign id生成器 通常使用一个特定的id生成器foreign

hibernate多表关联查询

hibernate多表关联查询

Hibernate是典型的OPM工具,它将每一个物理表格(Table)映射成为对象(Object),这发挥了面向对象的优势,使设计和开发人员可以从面向对象的角度来进行对数据库的管理。

在设计到多表操作时,Hibernate提供了与数据库表关系相对应的对象映射关系,一对一、一对多和多对多在这里都可以通过Hibernate的对象映射关系(Set等)来实现。

这为一般情况下的数据库多表操作提供了便捷途径。

关于这方面的介绍已经很多,在这里不再复述。

但是,在有些情况下的多表操作,比如一个统计顾客在2005年的消费总金额的SQL操作如下:select , count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >='2005-01-01' and a.chargeEndTime < '2005-12-31' gourp by a.idCustomercustomer表和charge结构如下:customer表结构:+------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+-----+---------+-------+| IdCustomer | varchar(32) | | PRI | | || Name | varchar(30) | | | | |+------------+-------------+------+-----+---------+-------+charge表结构:+-----------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------+-------------+------+-----+---------+-------+| IdCharge | varchar(32) | | PRI | | || Fee | double | YES | | NULL | || ChargeTimeBegin | datetime | YES | | NULL | || ChargeTimeEnd | datetime | YES | | NULL | |+-----------------+-------------+------+-----+---------+-------+在Hibernate的自带文档中有类似下面的多表查询操作提示:“select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...”,分析一下可以看出这个操作有两个缺点:1)必须声明并创建类ObjectC,根据Hibernate的特点,需要写一个ObjectC.hbm.XML 的PO映射,在只用到创建查询结果的新对象的时候,这个映射可以是个虚的,即可以没有一个真正的数据库表和ObjectC对应,但是这样的一个虚设的逻辑显然已经违背了Hibernate的思想初衷;2)这个办法只能查询出但条结果记录并只能创建单个的ObjectC对象,这是很局限的,因此在某些情况下根本不能使用(比如本例)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate多对一关联映射首先有两个实体,User和Group这里多对一,所以以多的一方为主控方。

(即为:User)package org.hibernate.many2one1.entity;import java.util.Date;/*** User generated by hbm2java*/public class User implements java.io.Serializable {private Integer id;private String name;private Group group;public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getName() {return ;}public void setName(String name) { = name;}}Group.javapackage org.hibernate.many2one1.entity;// Generated 2010-8-27 14:37:02 by Hibernate Tools 3.2.1.GA /*** Group generated by hbm2java*/public class Group implements java.io.Serializable {private int int_;private String name;public int getInt_() {return int_;}public void setInt_(int int_) {this.int_ = int_;}public String getName() {return name;}public void setName(String name) { = name;}}User.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd"><!-- Generated 2010-8-27 14:33:42 by Hibernate Tools 3.2.1.GA --><hibernate-mapping><class name="er" table="user" catalog="ibatisdb"><id name="id" type="ng.Integer"><column name="id_" /><generator class="identity" /></id><property name="name" type="string"><column name="name_" length="50" /></property><many-to-one name="group" column="groupid_" cascade="all"/></class></hibernate-mapping><many-to-one name="group" column="groupid_" cascade="all"/>这句话的意思是说,在User表里会自动的加上一个groupid_字段作为外键。

cascade="all"是指级联关系,即操作User的话group也会跟着被更新。

多对一的意思:就是在多的一端(User)加上外键,指向一的一端(Group)关联映射的本质,将关联关系映射到数据库中,关联关系是指对象模型中的一个或者多个引用。

例如本例中User实体中的private Group group;<many-to-one>标签,会在多的一端添加一个外键,指向一的一端。

这个外键是由<many-to-one>中column="groupid_"来指定的。

一对多关联(单向)其实一对多就是多对一的相反,所以这里我们还是使用上一篇中的实体类。

不过略有变化,是以一的一方为主控方。

Group.javapackage org.hibernate.many2one1.entity;// Generated 2010-8-27 14:37:02 by Hibernate Tools 3.2.1.GAimport java.util.HashSet;import java.util.Set;/*** Group generated by hbm2java*/public class Group implements java.io.Serializable {private int int_;private String name;private Set<User> users = new HashSet<User>();public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {ers = users;}public int getInt_() {return int_;}public void setInt_(int int_) {this.int_ = int_;}public String getName() {return name;}public void setName(String name) { = name;}}User.javapackage org.hibernate.many2one1.entity;// Generated 2010-8-27 14:33:39 by Hibernate Tools 3.2.1.GAimport java.util.Date;/*** User generated by hbm2java*/public class User implements java.io.Serializable {private Integer id;private String name;public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getName() {return ;}public void setName(String name) { = name;}}Group.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd"><!-- Generated 2010-8-27 14:37:02 by Hibernate Tools 3.2.1.GA --><hibernate-mapping><class name="org.hibernate.many2one1.entity.Group" table="group" catalog="ibatisdb"> <id name="int_" type="int"><column name="int" /><generator class="assigned" /></id><property name="name" type="string"><column name="name" length="20" /></property><Set name="users"><key column="groupid_"/><one-to-many class="er"/></Set></class></hibernate-mapping>多对一关联映射:在多的一端添加一个外键指向一的一端,主控方是多的一端。

一对多关联映射:在多的一端添加一个外键指向一的一端,主控方是一的一端。

所以一对多和多对一关联映射的策略是一致的,只是站的角度不同。

下面来看看双向关联。

User实体需要改变:package org.hibernate.many2one1.entity;// Generated 2010-8-27 14:33:39 by Hibernate Tools 3.2.1.GAimport java.util.Date;/*** User generated by hbm2java*/public class User implements java.io.Serializable {private Integer id;private String name;private Group group;public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getName() {return ;}public void setName(String name) { = name;}}User.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd"><!-- Generated 2010-8-27 14:33:42 by Hibernate Tools 3.2.1.GA --><hibernate-mapping><class name="er" table="user" catalog="ibatisdb"><id name="id" type="ng.Integer"><column name="id_" /><generator class="identity" /></id><property name="name" type="string"><column name="name_" length="50" /></property><many-to-one name="group" column="groupid_"/></class></hibernate-mapping><many-to-one name="group" column="groupid_" inverse="true"/>这里的groupid必须和group.hbm.xml中的<key column="groupid_"/>一样。

相关文档
最新文档