




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
烟台华东电子软件技术有限公司第8章 hibernate数据源层O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用SQL/JDBC:优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。这项工作通常会消耗很大一部分的开发努力。此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。持久化的另一种用法是在机器集群中跨节点复制应用状态。缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。甚至不可能独立地访问或更新一个单独的对象或子图。非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。在特定的环境中它被作为桌面应用的适当的持久化机制。EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。在EJB1.1许多明显的缺陷被纠正之后,一个边缘的稍微可接受的解决方案是容器管理的持续性(CMP)。然而,CMP并不能表示一种对象-关系不匹配的解决方案。CMP缺点: CMP实体Bean的粒度既太粗又太细:CMP Bean与关系模型中的表是按照一对一的方式定义的。这样,它们的粒度过粗,不能够完全利用Java丰富的类型。 虽然EJB可以利用继承实现,但实体Bean并不支持多态的关联和查询 不管EJB规范所宣称的目标,实体Bean实际上是不可移植的。CMP引擎的性能因厂商而异,并且映射元数据也是高度特定于厂商的。 实体Bean不可序列化。我们发现当我们需要将数据传输到远程客户层时,我们必须定义额外的数据传输对象(DTO,也被称作值对象) 实体Bean必须依赖于EJB容器测试困难。JDO、Object-oriented database systems大多数面向对象的数据库系统对ODMG标准都提供了许多程度的支持,但据我们所知,还没有完全的实现。此外,在规范发布以后的很多年,甚至到了3.0版,还是感觉不太成熟,并且缺乏很多有用的特征,特别是基于Java环境的。ODMG也不再活跃。最近,Java数据对象(JDO)规范(发表于2002年4月)揭开了新的可能性。JDO由面向对象数据库团体的成员驱动,除了对现有的ODMG的支持之外,面向对象的数据库产品现在还经常将其作为主要的API采用。JDO 的优点在于它很简单。开发人员使用 Java 语言持久存储对象实例并从存储器检索实例。处理逻辑、同步和故障转移等均被透明地处理。开发人员无需使用 SQL 或 Java 语言提供的不便的序列化机制,只使用 POJO(无格式普通 Java 对象)即可,利用 JDO 接口将对象引用传递到存储器中并从存储器检索对象引用。O/R Mapping什么是O/R Mapping?它有什么优点?简单地说,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示(双向)转换为另一种。提高生产率(Productivity)与持久性有关的代码可能是Java应用中最乏味的代码。Hibernate去掉了很多让人心烦的工作(多于你的期望),让你可以集中更多的精力到业务问题上。不论你喜欢哪种应用开发策略自顶向下,从域模型开始;或者自底向上,从一个现有的数据库模式开始使用Hibernate和适当的工具将会减少大量的开发时间。可维护性(Maintainability) 减少了代码,重构更方便,提高了可维护性。ORM是对象和关系数据库之间的缓冲区,用来很好的将他们隔离。更好性能(Performance)ORM软件的实现人员可能有比你更多的时间来研究性能优化问题。你知道吗,例如,缓存PreparedStatement的实例对DB2的JDBC驱动导致了一个明显的性能增长但却破坏了InterBase的JDBC驱动?你了解吗,对某些数据库只更新一个表中被改变的字段可能会非常快但潜在地对其它的却很慢?在你手工编写的解决方案中,对这些不同策略之间的冲突进行试验是多么不容易呀?厂商独立性(Vendor independence)ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式。如果工具支持许多不同的数据库(dialect),那么这会给你的应用带来一定程度的可移植性。你不必期望可以达到“一次编写,到处运行”,因为数据库的性能不同并且达到完全的可移植性需要牺牲更强大的平台的更多的力气。然而,使用ORM开发跨平台的应用通常更容易。即使你不需要跨平台操作,ORM依然可以帮你减小被厂商锁定的风险。另外,数据库独立性对这种开发情景也有帮助:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上。如何做对象关系数据库映射?(最后引入Hibernate)public class User private Long id;private String name;private List address;create table tbl_user (id bigint not null auto_increment, name varchar(255), primary key (id)Java数据库类的属性(基本类型)表的列类表1:n/n:1外键n:m关联表继承单表继承、具体表继承、类表继承1、 Java基本类型表的2、 Java类的映射3、 关联的映射:例如一个User有多个Address,User和Address管理,User删除时,相应的Address也应该删除。对象关系的不匹配范式(paradigm)1、 粒度(granularity)的问题。 增加一种新的数据类型,将Java地址对象在我们的数据库中保存为单独的一列,听起来好像是最好的方法。毕竟,Java中的一个新的地址类与SQL数据类型中的一个新的地址类型可以保证互用性。然而,如果你检查现在的数据库管理系统对用户定义列类型(UDT)的支持,你将会发现各种各样的问题。2、 子类型(subtypes)的问题。 子类型不匹配是指Java模型中的继承结构必须被持续化到SQL数据库中,而SQL数据库并没有提供一个支持继承的策略。如何解决多态?3、 同一性(identity)的问题Java对象定义了两种不同的相等性的概念: 对象同一性(粗略的等同于内存位置的相等,使用a=b检查) 通过equals()方法的实现来决定的相等性(也被称作值相等)另一方面,数据库行的同一性使用主键值表示。主键既不必然地等同于“equals()”也不等同于“=”。它通常是指几个对象(不相同的)同时表示了数据库中相同的行。而且,为一个持续类正确地实现equals()方法包含许多微妙的难点。4、 与关联(associations)有关的问题面向对象的语言使用对象引用和对象引用的集合表示关联。在关系世界里,关联被表示为外键列,外键是几个表的键值的拷贝。这两种表示之间有些微妙的不同。5、 对象结构导航的问题在Java中访问对象的方式与在关系数据库中有根本的不同。在Java中,访问用户的账单信息时,你调用aUser.getBillingDetails().getAccountNumber()。这是最自然的面向对象数据的访问方式,通常被形容为遍历对象图。根据实例间的关联,你从一个对象导航到另一个对象。不幸地是,这不是从SQL数据库中取出数据的有效方式。为了提高数据访问代码的性能,唯一重要的事是最小化数据库请求的次数。最明显的方式是最小化SQL查询的数量(其它方式包括使用存储过程或者JDBC批处理API)。使用SQL有效地访问关系数据通常需要在有关的表之间使用连接。在连接中包含的表的数量决定了你可以导航的对象图的深度。性能:N+1的问题 范式不匹配的代价:1、花费很多时间和精力来手工解决对象和关系的不匹配。2、为了解决不匹配,甚至要扭曲对象模型直到它与下层的关系技术匹配为止4、 JDBC API本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。主流持久层框架纵览目前众多厂商和开源社区都提供了持久层框架实现,常见的有:Apache OJB(/ojb/ )Cayenne(/cayenne/ )Jaxor( )Hibernate()iBATIS( )jRelationalFramework()mirage(/en/oss/mirage/toon)SMYLE(http:/www.drjava.de/smyle/)TopLink(/products/ias/toplink/index.html )(其中TopLink 是Oracle 的商业产品。其他均为开源项目)Apache OJB 的优势在于对各种标准的全面支持(不过事实上,我们的系统研发中并不需要同时支持这么多标准,追求多种标准的并行支持本身也成为Apache OJB 项目发展的沉重包袱),且其从属于Apache 基金组织,有着可靠的质量保证和稳定的发展平台。Hibernate 在2003 年末被JBoss 组织收纳,成为从属于JBoss 组织的子项目之一,从而赢得了良好的发展前景(同时荣获Jolt 2004 大奖)。Hibernate 与OJB 设计思想类似,具备相近的功能和特色,但由于其更加灵活快速的发展策略,得到了广大技术人员的热情参与,因此也得到了更广泛的推崇。相对ApacheOJB 迟钝的项目开发进度表,Hibernate 活跃的开发团队以及各社区内对其热烈的关注为其带来了极大的活力,并逐渐发展成Java 持久层事实上的标准。iBATIS 相对Apache OJB 和Hibernate 项目则另具特色,iBATIS 采取了更加开放式的设计,通过iBATIS,我们可以控制更多的数据库操作细节。相对而言,Hibernate、Apache OJB 对持久层的设计则较为封闭,封闭化的设计对持久层进行了较为彻底的封装,从而将底层细节与上层架构完全分离,大多数情况下,特别是对于新系统,新产品的研发而言,封闭化的设计带来了更高的开发效率和更好的封装机制,但是在某些情况下,却又为一些必须的底层调整带来了阻力,如在对遗留系统的改造和对既有数据库的复用上,表现出灵活性不足的弱点。此时作为OJB,Hibernate 的一个有益补充,iBATIS的出现显得别具意义。Hibernate入门Hibernate概述Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。(O/R Mapping是一项实用的工程技术,把数据库的E/R模型用java的OO语法描述出来,Hibernate是其中的当之无愧的最耀眼的明星,cglib动态增强,多种灵活的class继承树映射机制,广泛的社团支援,掩盖了其他项目的光辉。)Hibernate的优势 开源(LGPL) 成熟 流行(约13 000 downloads/month) 自定义APIJBoss 将用Hibernate3实现Entity Beans使用Hibernate的开发步骤1、 设计一般首先进行领域对象的设计。因为在Hibernate中,我们的领域对象可以直接充当持久化类。2、 映射定义Hibernate的映射文件,实现持久化类和数据库之间映射。3、 应用使用Hibernate提供的API,实现具体的持久化业务。Hibernate的映射Entity-hbm-ddl(数据库)(hbm(hibernate mapping)和ddl(Data Definition Language)的全称)之间的互相转换User.java User.hbm.xmlXDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(/)。XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。Middlegen: 用来从数据库中已有的表结构中生成Hibernate映射文件。当前版本是2.1可以去http:/boss.bekk.no/boss/middlegen下载。Hibernate核心接口Configuration:正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要获取一些底层实现的基本信息,其中几个关键属性包括:1、数据库URL2、数据库用户3、数据库用户密码4、数据库JDBC驱动类5、 数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。Hibernate配置有两种方法:一、 属性文件配置。默认文件名是perties。调用代码: Configuration config = new Configuration();二、 XML文件配置。默认文件名是hibernate.cfg.xml。Configuration config = new Configuration().configure();SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。SessionFactory sessionFactory = config.buildSessionFactory();Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的概念介于Connection和Transaction之间。我们可以简单的认为它是已经装载对象的缓存或集合的一个独立工作单元。我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。Hibernate会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用。Hibernate会话与Web层的HttpSession没有任何关系。Session session = sessionFactory.openSession();Transaction:事务将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。Transaction trans = session.beginTransaction ();Query: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。Query query = session.createQuery(“from User”);Lifecycle:Lifecycle接口提供了一些回调方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。public interface Lifecycle public boolean onSave(Session s) throws CallbackException; (1) public boolean onUpdate(Session s) throws CallbackException; (2) public boolean onDelete(Session s) throws CallbackException; (3) public void onLoad(Session s, Serializable id); (4)(1) onSave - 在对象即将被save或者insert的时候回调 (2) onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候) (3) onDelete - 在对象即将被delete(删除)的时候回调 (4) onLoad - 在对象刚刚被load(装载)后的时候回调Validatable: 该接口是合法性检查的回调。如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口: public interface Validatable public void validate() throws ValidationFailure;如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。 和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。Interceptor: Interceptor接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是用来监视统计信息。比如,下面的Interceptor会自动在一个Auditable创建的时候设置其createTimestamp,并且当它被更改的时候,设置其lastUpdateTimestamp属性。UserType: 开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的Java属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAME, INITIAL, SURNAME。 要实现一个自定义类型,可以实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType中的任一个,并且使用类型的Java全限定类名来声明属性。请查看net.sf.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。 注意使用标签来把一个属性映射到多个字段的做法。用户的例子设计:用户,id name映射:User.java User.hbm.xml一、安装二、持久化类(Persistent Class)持久化类不需要实现什么特别的接口,也不需要从一个特别的持久化根类继承下来。Hibernate也不需要使用任何编译期处理,比如字节码增强操作,它独立的使用Java反射机制和运行时类增强(通过CGLIB)。所以,在Hibernate中,POJO的类不需要任何前提条件,我们就可以把它映射成为数据库表。持久化类必须遵循的原则:1、 为类的持久化类字段申明访问方法(Get/set)。Hibernate对JavaBeans风格的属性实行持久化。2、 实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。3、 如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set4、 提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。三、 hibernate映射文件四、应用:TestUser.java之后做个总结,特别是CRUD操作。Hibernate映射声明(Mapping declaration)一、 DOCTYPE声明。一个XML document应该在文档的起始位置有一个XML的声明,可能跟随着一个DOCTYPE的声明。一个DOCTYPE声明告诉一个XML parser这个XML文档遵循了哪一个DTD(Document Type Declaration)。Parser可以用此信息来确认这个XML文档包含的仅是这个DTD声明的XML element。例如:DTD可以从上述URL中获取,或者在hibernate-x.x.x/src/net/sf/hibernate目录中,或hibernate.jar文件中找到。Hibernate总是会在它的classptah中首先搜索DTD文件。二、 hibernate-mapping它是文档的根(root),可以包含多个类的映射,但一般只包含一个类。(1)、schema(可选):数据库Schema Name(2)、default-cascade(可选,默认为none):默认的级联风格(3)、auto-import(可选,默认为true):是否允许在查询语言中使用非完全限定的类名即只用类的名称,不用加入包名(仅限本映射文件中定义的类)。(4)、package(可选),如果该映射文件中定义的类名不包含package,则使用这里定义的package作为类名的前缀。注:(3)默认的值是“true”,如果有多个类的名字相同,则必须将该值设为false。三、class用class元素来定义一个持久化类。1、 name:持久化类(或Java接口)的全名。2、 table:对应的数据库表名。3、 discriminator-value(鉴别值)(可选,默认和类名一样):一个用于区分不同子类的值,在多态行为中使用。4、 mutable(可选,默认值为true):表明该类是否可以改变。如果将它设为false,则应用程序不能对此类对应的数据进行修改和删除。5、 schema(可选):覆盖在根元素中指定的schema名字。6、 proxy(可选):指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。7、 dynamic-update(动态更新) (可选,默认为false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。 8、 dynamic-insert(动态插入) (可选, 默认为false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。 9、 select-before-update (可选,默认值为false): 指定Hibernate除非确定对象的确被修改了,不会执行SQL UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新的session中去,执行update()的时候),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该进行UPDATE。 10、 polymorphism(多形,多态) (可选, 默认值为 implicit (隐式): 界定是隐式还是显式的使用查询多态。 11、 where (可选) 指定一个附加的SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条件。 12、 persister (可选): 指定一个定制的ClassPersister。 13、 batch-size (可选,默认是1) 指定一个用于根据标识符抓取实例时使用的batch size(批次抓取数量)。 14、 optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。 15、 lazy(延迟) (可选): 假若设置 lazy=true,就是设置这个类自己的名字作为proxy接口的一种等价快捷形式。四、id持久化类必须要声明一个字段对应数据库表的主键。 (5) (1)、name(可选):标识属性的名称。(2)、type(可选):标识Hibernate类型的名字。(3)、column(可选默认为属性名):对应数据库表的主键字段的名字。(4)、unsaved-value(可选默认为null):这个值用来判断对象是否要保存。如果一个对象id值与该值相等时,Hibernate则会认为该对象是一个新的对象,并没有持据化到数据库中。举例:假如一个新建对象的属性id的类型为int,我们知道如果不给id赋值,它默认的值就应该是“0”,如果这时unsaved-value是默认的null。则当保存这个新建对象,调用session. SaveOrUpdate()方法时会抛出异常。因为id的值不等于null,所以Hibernate会认为该对象已经保存,它会去执行update操作。Generator主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识。例如: uid_table next_hi_value_column 所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口。这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:1、 数据库提供的主键生成机制。identity、sequence、2、 外部程序提供的主键生成机制。increment ,hilo,seqhilo,uuid.hex,uuid.string3、 其它。native,assigned,foreignincrement(递增):主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。identity采用数据库提供的主键生成机制(数据库内部支持标识字段)。如DB2、SQL Server、MySQL中的主键生成机制。返回的标识符是long, short 或者int类型的。sequence (序列):采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。hilo (高低位): 通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。seqhilo(使用序列的高低位):与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。uuid.hex用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。)。UUID被编码为一个32位16进制数字的字符串。uuid.string使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串native(本地)根据底层数据库的能力选择identity, sequence 或者hilo中的一个assigned(程序设置)让应用程序在save()之前为对象分配一个标示符。foreign(外部引用)使用另外一个相关联的对象的标识符。和联合一起使用。五:property元素为类声明了一个持久化的,JavaBean风格的属性。 (1) name: 属性的名字,以小写字母开头。 (2) column (可选 - 默认为属性名字): 对应的数据库字段名。 (3) type (可选): 一个Hibernate类型的名字。 (4) update, insert (可选 - 默认为 true) :表明在用于UPDATE 和/或 INSERT的SQL语句中是否包含这个字段。这二者如果都设置为false则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个)字段的某些其他属性,或者通过一个trigger(触发器),或者其他程序。 (5) formula (可选): 一个SQL表达式,定义了这个计算(computed) 属性的值。计算属性没有和它对应的数据库字段。 (6) access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。六、多对一个(many-to-one)(1) name: 属性名。 (2) column (可选): 字段名。 (3) class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。 (4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。 (5) outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。 (6) update, insert (可选 - defaults to true) 指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(触发器),或者是其他程序。 (7) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。 该属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。(8) access (可选 - 默认是 property): Hibernate用来访问属性的策略。七、一对多(one-to-many)(1) name 集合属性的名称 (2) table (可选)目标关联数据库表(3) lazy (可选默认为false)允许延迟加载(lazy initialization )(4) inverse (可选默认为false) 标记这个集合作为双向关联关系中的方向一端。 (5) cascade (可选默认为none) 让操作级联到子实体 (6) sort(可选默认为unsorted)指定集合的排序顺序, 其可以为自然的(natural)或者给定一个用来比较的类。 (7) order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序 (8) where (可选) 指定任意的SQL where条件。该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用)(9) outer-join(可选-默认为a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度技术合作协议 智慧城市规划技术服务委托合同
- 足疗协议书价书
- 协议书找人代签
- 2025租赁与买卖合同的区别
- 2025年海南省勘察设计注册岩土工程师考试(岩土专业基础)全真题库及答案
- 食品赔偿和解协议书
- 2025合同样本土地使用权转让合同模板范本
- 司机雇佣协议书
- 电脑协议书丢失
- 移动解除协议书
- 《研究生入学教育》课件
- 汽车行业中的环境保护与可持续发展
- 打起手鼓唱起歌混声合唱简谱
- 空调安装免责协议
- QGW 201175-2019-金风陆上风力发电机组 塔架通用防腐技术规范
- 老友记第一季字幕
- 输电线路风偏计算基本方法
- 骨科概论课件
- 第5章光电成像系统
- GB/T 9117-2010带颈承插焊钢制管法兰
- GB/T 5455-2014纺织品燃烧性能垂直方向损毁长度、阴燃和续燃时间的测定
评论
0/150
提交评论