版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate项目的构建与配置1. 在项目里倒入Hibernate所必须的Jar包(1) Hibernate框架可以使用在任何的Java项目里,并不一定是Web项目。只需要在项目里倒入Hibernate所必须要使用的jar包就可以了。(2) 在Hibernate的官网下载hibernate-release-4.2.2.Final.zip解压,要使用Hibernate必须导入的jar包就在目录“hibernate-release-4.2.2.Finallibrequired”下。倒入此路径下的所有jar包就可以了。2. 配置hibernate.cfg.xml文件(1) 配置hibernate
2、.cfg.xml文件可以参考“projectetc”目录下的hibernate.cfg.xml文件与perties文件。(2) 使用Hibernate连接MySQL的hibernate.cfg.xml配置文件如下:<hibernate-configuration><session-factory>(设置显示Hibernate产生的SQL语句)<property name="show_sql">true</property>(设置MySQL的SQL语法的方言)<property name=&quo
3、t;hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>(设置MySQL的驱动程序)<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>(设置MySQL的数据库路径、用户名、密码)<property name="hibernate.connection.url">jdbc:mysql:/java<
4、;/property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">lizhiwei</property>(设置当数据库要保存的表不存在时,就新建表)<property name="hibernate.hbm2ddl.auto">update</property>(设置对象与数据库表的关系
5、映射文件)<mapping resource="vo/User.hbm.xml"/></session-factory></hibernate-configuration>(3) 此配置文件一般放在项目的src目录下。(注意:在项目中要加入MySQL的驱动jar包)3. 编写实例类与对象-关系映射文件(1) 一个实例类对象就是数据库表里的一条记录,关系映射文件就指明了类的成员变量与数据库字段间的关系以及该类对象保存在哪个表中。(2) 实例类User.java:public class User private long id;privat
6、e String name;private int age;private char sex;public long getId() return id;public void setId(long id) this.id = id;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public char getSex() re
7、turn sex;public void setSex(char sex) this.sex = sex;Overridepublic String toString() return "User id=" + id + ", name=" + name + ", age=" + age + ", sex="+ sex + ""(3) User.java对应的User.hbm.xml文件:(package的值是User.java所在的包路径)<hibernate-mapping packa
8、ge="vo">(name的值是实例的类名,table的值是对应的数据库表名)<class name="User" table="User">(name的值是实例的主键名) <id name="id">(定义了主键值生成器)<generator class="native"></generator> </id>(定义实例属性与数据库表字段的对应关系) <property name="name"/>
9、<property name="age"/> <property name="sex"/> </class></hibernate-mapping>(4) User.hbm.xml文件与User.java文件放在同一目录下。4. 编写测试类(1) 测试类Hibernate.java如下:package test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;i
10、mport org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import vo.User;public class Hibernate public static void main(String args) Configuration cfg=new Configuration();cfg.configure();ServiceRegistry sr = new ServiceRegi
11、stryBuilder().applySettings(cfg.getProperties().buildServiceRegistry();SessionFactory sf=cfg.buildSessionFactory(sr);Session s=sf.openSession();Transaction tx=s.beginTransaction();User u=new User();u.setName("KKKK");u.setAge(20);u.setSex('f');s.save(u);mit();s.close();System.out.pr
12、intln("OK");(2) 运行Hibernate.java即可在数据库里保存一条记录!Hibernate.cfg.xml文件的配置1. hibernate.dialect属性配置2. hibernate.show_sql属性配置3. hibernate.format_sql属性配置4. hibernate.default_schema属性配置5. hibernate.default_catalog属性配置6. hibernate.session_factory_name属性配置7. hibernate.max_fetch_depth属性配置8. hibernate.d
13、efault_batch_fetch_size属性配置9. hibernate.default_entity_mode属性配置10. hibernate.order_updates属性配置11. hibernate.generate_statistics属性配置12. hibernate.use_identifer_rollback属性配置13. hibernate.use_sql_comments属性配置14. hibernate.jdbc.fetch_size属性配置15. hibernate.jdbc.batch_size属性配置16. hibernate.jdbc.batch_vers
14、ioned_data属性配置17. hibernate.jdbc.factory_class属性配置18. hibernate.jdbc.use_scrollable_resultset属性配置19. hibernate.jdbc.use_streams_for_binary属性配置20. hibernate.jdbc.use_get_generated_keys属性配置21. vider_class属性配置22. hibernate.connection.isolation属性配置23. hibernate.connection.autocom
15、mit属性配置24. hibernate.connection.release_mode属性配置25. hibernate.connection.<propertyName>属性配置26. hibernate.jndi.<propertyName>属性配置27. vider_class属性配置28. hibernate.cache.use_minimal_puts属性配置29. hibernate.cache.use_query_cache属性配置30. hibernate.cache.use_second_level_cache属
16、性配置31. hibernate.cache.query_cache_factory属性配置32. hibernate.cache.region_prefix属性配置33. hibernate.cache.use_structured_entries属性配置34. hibernate.transaction.factory_class属性配置35. jta.UserTransaction属性配置36. hibernate.transaction.manager_lookup_class属性配置37. hibernate.transaction.flush_before_completion属性
17、配置38. hibernate.transaction.auto_close_session属性配置39. hibernate.current_session_context_class属性配置40. hibernate.query.factory_class属性配置41. hibernate.query.substitutions属性配置42. hibernate.hbm2ddl.auto属性配置43. hibernate.cglib.use_reflection_optimizer属性配置44. <hibernate-configuration>节点的配置说明45. <s
18、ession-factory>节点的配置说明46. <property>节点的配置说明47. <mapping>节点的配置说明(1) 说明:用于指定需要加载的映射文件,可以有多个<mapping>节点。(2) resource属性:用于指定映射文件的路径。如果Hibernate的配置文件是Java属性文件,那么程序必须以编程的方式申明需要加载的映射文件;如果Hibernate的配置文件是XML格式,那么只需要在配置文件中申明映射文件。a) Hibernate的配置文件是Java属性文件,如:Configuration cfg=new Configura
19、tion();cfg.addClass(vo.User.class);/加载映射文件b) Hibernate的配置文件是XML文件,如:Configuration cfg=new Configuration();cfg.configure();/加载hibernate.cfg.xml配置文件48.对象关系映射文件的配置1. 对象关系映射文件的说明(1) 作用:用来确定持久化类与数据库表的关系。(2) 命名规则与存放位置:对象关系映射文件的命名可以任意只是文件后缀是.xml,也可以多个持久化类使用同一个映射文件。但是为了便于维护和项目的可读性,一般为每个持久化类些单独的映射文件,并使用XXX.h
20、bm.xml的形式来命名,“XXX”既是持久化类名,并且持久化类与其映射文件放在同一目录下。2. <hibernate-mapping>节点的配置说明(1)3. <class>节点的配置说明(1) 说明:class节点指定类和表的映射,且class属性包含一个id属性和多个property属性。(2) name属性:用来设置类名,如:name="vo.User",其值一般是包点类名称,也可以是类名。该属性必须要设置。(3) table属性:用来设置表名,如:table="User",其值是数据库表名,该属性可以不设置,不设置时持久
21、化类对应的数据库表名就与其类名称相同。(4) lazy属性:用来设置session的load()方法的检索策略。值为true,表示是使用延迟检索策略;为false,表示采用立即检索策略。(5) select-before-update属性:用来设置session的update()方法执行update操作时是否先执行一次select以确定数据发生变化之后才进行更新,默认值是false即不执行select。当持久化对象的属性不经常变化时,一般设置成true。(6) <discriminator>子节点:(column属性、type属性)(7) <subclass>子节点:(
22、name属性、discriminator-value属性)(8) <joined-subclass>子节点:(name属性、table属性、extends属性)(9)4. <id>节点的配置说明(1) 说明:id节点设定持久化类的OID和表的主键映射。(2) name属性:用于指定持久化类的OID属性名,该属性是必须设置的。(3) column属性:用于指定与类的属性映射的表的主键名。该属性可以没有,若没有则Hibernate认为表的主键名与类的OID属性名一样。(4) type属性:用于指定Hibernate映射类型。该属性可以没有,若没有该属性Hibernate会使
23、用反射机制识别类型。(5) id元素的子元素<generator>指定对象标识符生成器,它负责为对象的OID生成唯一的标识符。generator的class属性用来指定OID值的生成类,既可使用完整的标识符生成器的类名,也可以使用缩写名。例如:<generator class="identity"/>(6) <generator>节点常使用的Hibernate内置的标识符生成器a) increment:适用于代理主键,由Hibernate自动以递增的方式生成标识符,每次增量为1。适用范围:由于increment生成标识符的机制不依赖于底层
24、数据库系统,因此它适合所有的数据库系统;适用于只有单个Hibernate应用进程访问同一个数据库的场合;OID必须为long、int、short类型。b) identity:适用于代理主键,由底层数据库生成标识符,前提条件是底层数据库支持自动增长的字段类型,例如:DB2、MySQL、MS SQLServer、Sybase等。适用范围:由于identity生成标识符的机制依赖于底层数据库系统,因此要求底层数据库系统必须支持自动增长的字段类型;OID必须是long、int、short类型。c) sequence:适用于代理主键,Hibernate根据底层数据库的序列来生成标识符,前提条件是底层数据
25、库支持序列,例如DB2、Oracle等。适用范围:适用于支持序列的数据库;OID必须是long、int、short类型。d) hilo:适用于代理主键,Hibernate根据high/low算法来生成标识符,Hibernate把特定的表字段作为“high”值,在默认情况下选用hibernate_unique_key表的next_hi字段。适用范围:适用于所有的数据库;OID必须是long、int、short类型;high/low算法生成的标识符只能在一个数据库中保证唯一;当用户为Hibernate自行提供数据库连接,或Hibernate通过JTA,从应用服务器的数据源获得数据库连接的时候无法使
26、用hilo,因为这不能保证hilo单独在新的数据库连接事物中访问hi_value表。e) native:适用于代理主键,根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence或hilo。适用范围:适用于所有的数据库;OID必须是long、int、short类型。f) uuid.hex:适用于代理主键,Hibernate采用128位的UUID算法来生成标识符,UUID能在网络环境下生成唯一的字符串标识符。g) assigned:适用于自然主键,由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法申明为private类型。h)
27、select:适用于遗留数据库中的代理主键或自然主键,由数据库中的触发器来生成标识符。i) foreign:用另一个关联对象的标识符来作为当前对象的标识符,主要用于一对一的关联场合。(7) unsaved-value属性:用于设置OID的默认值,来判断持久化对象是否已经保存。该属性的默认值是null。如果某个持久化对象的OID值与设置的默认值一样,则认为该对象还未保存。(8)5. <property>节点的配置说明(1) 说明:property节点设定类的属性和表的字段映射。(2) name属性:用于指定持久化类的属性名,该属性是必须设置的。(3) type属性:用于指定Hiber
28、nate映射类型。该属性可以没有,若没有该属性Hibernate会使用反射机制识别类型。(4) column属性:用于指定与类的属性映射的表的字段名。该属性可以没有,若没有则Hibernate认为表的字段名与类的属性名一样。<property>节点可以有<column>子节点,如:<property name="sex"> <column name="SEX"/> </property>。如果数据表名或字段名包含空格或特殊字符时,可以使用引用标识符,如:<property name=&qu
29、ot;age" column="'USER AGE'"/>。(5) access属性:用于指定Hibernate访问持久化类的属性方式,有连个可选值。property是默认值,表明通过相应的setXXX()和getXXX()方法来访问类的属性。field是另一个可选值,表明直接运用反射机制访问类的属性,没有setXXX()和getXXX()方法也能访问。(6) formula属性:用来设置一个SQL表达式,Hibernate将根据它来计算出派生属性的值。(持久化类的有些属性的值必须在运行时通过计算才能得出来,这种属性称派生属性)例如:<
30、property name="avgAge" formula="(select avg(u.AGE) from USER u)"/>或<property name="name" formula="Lower(NAME)"/>(7) 用于控制insert与update的属性a) 说明:在默认情况下,Hibernate为持久化类预定义的SQL语句包含了所有的表字段,但可以使用insert、update等属性来取消某些表字段的相关SQL操作。b) insert属性:如果为false,在insert语句中
31、不包含该字段,表明该字段永远不能被插入,默认为true。c) update属性:如果为false,update语句中不包含该字段,表明该字段永远不能被更新,默认为true。d) mutable属性:如果为false,等价所有的<property>元素的update属性为false,表示整个实例不能被更新,默认为true。e) dynamic-insert属性:如果为true,表示保存一个对象时,会动态的生成insert语句,insert语句中仅只包含所有取值不为null的字段,默认为false。f) dynamic-update属性:如果为true,表示更新一个对象时,会动态的生成
32、update语句,update语句中只包含取值需要更新的字段,默认为false。(8)(9)6. <one-to-one>节点的配置说明(1) 说明:用于持久化对象的一对一的关联关系,对于数据库来说是属于外键映射。(2) name属性:设定要映射的持久化类的属性名。(3) class属性:设定要映射的持久化类的属性的类型。(4) constrained属性:约束,表明主控表的主键上是否存在一个外键对其进行约束,这个选项关系到save、updae等方法的级联操作顺序。默认为false。(5)7. <set>节点的配置说明(1) 说明:用于持久化对象的一对多的关联关系,对于
33、数据库来说是属于外键映射。(2) name属性:设定要映射的持久化类的属性名。(3) cascade属性:操作级联。如:当取值是all-delete-orphan时,当被关联对象失去关联宿主时将其级联删除。取值可以是:none、all、save-update、delete、lock、refresh、delete-orphan、all-delete-orphan。(4) <key>子节点a) 说明:b) column属性:用于设置外键。(5) <one-to-many>子节点a) 说明:b) class属性:用于设置当前持久化类的集合属性里存放的持久化类型。(6) inv
34、erse属性:用于标识双向关联中被动方一端,inverse=false的一方(主控方)负责维护关联关系。默认值为false。在映射一对多双向关联时应在“one”的一方把<set>元素的inverse值设置为true,这可以减少对数据库的操作,提高性能。(7) <element>子节点a) 说明:b) column属性:c) type属性:d) not-null属性:(8) sort属性:(9) order-by属性:(10)8. <many-to-one>节点的配置说明(1) 说明:用于对象之间的多对一的关联关系,对于数据库来说是属于外键映射。(2) nam
35、e属性:设定要映射的持久化类的属性名。(3) column属性:设定和持久化类的属性对应的表的外键。(4) class属性:设定要映射的持久化类的属性的类型。(5) not-null属性:如果为true,表示该属性不能为空;默认为false。(6) lazy属性:如果为proxy,表示关联的持久化类对象使用延迟检索策略并使用代理,这是默认值。如果为false,表示加载当前持久化类对象时立即加载关联的持久化类对象。(7) cascade属性:操作级联。如:当取值是all-delete-orphan时,当被关联对象失去关联宿主时将其级联删除。取值可以是:none、all、save-update、d
36、elete、lock、refresh、delete-orphan、all-delete-orphan。(8)9. <component>节点的配置说明(1) 说明:当持久化的某一属性是特殊类型时,就用该节点配置此种属性与数据库的映射。(2) name属性:用于被映射的持久化类的属性名,该属性是用户自定义的类型。(3) class属性:用于设定该属性的类型,使用包点类名称。(4) <parent>子元素:其中的name属性用来指定该持久化类的属性所属的整体类。(5) <property>子元素:用来配置组件类的属性和表中字段的映射。10. <idbag&
37、gt;节点的配置说明(1) 说明:(2) <collection-id>子节点:11. <list>节点的配置(1) 说明:(2) name属性:(3) table属性:(4) lazy属性:(5) <list-index>子节点:(6) <element>子节点:(7) order-by属性:(8)12. <map>节点的配置(1) 说明:(2) name属性:(3) table属性:(4) lazy属性:(5) <key>子节点:(6) <map=key>子节点:(7) <element>子节点
38、:(8) sort属性:(9) order-by属性:(10)13.Hibernate应用1. Hibernate API的重要接口(1) Configuration接口:用于配置并启动Hibernate,Hibernate应用通过Configuration实例来获得对象-关系映射文件中的元数据,以及动态的配置Hibernate属性,然后创建SessionFactory实例。(2) SessionFactory接口:一个SessionFactory对应一个数据存储源,应用从SessionFactory获得Session实例。(3) Session接口:Session是Hibernate使用最广
39、泛的接口,Session也被称为持久化管理,它提供了和持久化相关的操作,如保存、更新、删除和加载对象。(4) Transaction接口:Transaction是Hibernate数据库事物接口,它对底层的事物做了封装,底层事物包括JDBC事物和JTA事物。(5) Query接口:Query是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程,Query实例包装了一个HQL查询语言。2. Hibernate的初始化(1) 初始化过程:a) 创建Configuration实例,Configuration类的构造方法会把默认文件路径下的Hibernate.cfg.xml(或
40、Hperties)配置文件信息读到内存中。b) 调用Configuration的addClass(O.class)方法,把默认路径下的O.hbm.xml文件中的映射信息读入内存。c) 调用Configuration的buildSessionFactory()方法,创建一个SessionFactory实例,并把Configuration里的配置信息复制到SessionFactory的缓存中。当对象SessionFactory创建后,该对象不会和Configuration对象关联,因此再修改Configuration对象的配置信息不会对,SessionFactory对象有任
41、何影响。(2) 例如(一般的做法):Configuration cfg=new Configuration();cfg.configure();ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties().buildServiceRegistry();SessionFactory sf=cfg.buildSessionFactory(sr);3. 访问Hibernate的Session接口(1) Session接口的常用方法:save()方法把对象保存到数据库中;update()方法更新数
42、据库中的对象;delete()方法把特定的对象从数据库中删除;get()(或load()方法从数据库中加载对象。(2) Session执行事物的流程(常用):Session s=sf.openSession();Transaction tx=s.beginTransaction();try/*执行事物代码*/提交事物mit();catch(RuntimeException e)/如果出现异常,就撤消事物if(tx!=null)tx.rollback();throw e;finally/不管事物执行是否成功,最后关闭Sessions.close();(3)4. 通过Hibernate操纵对象(1
43、) session缓存a) 当session调用get()方法试图从数据库加载一个持久化对象时,session先判断缓存中是否已经存在这个对象,如果存在就不需要到数据库中检索,直接从缓存中获取这个对象。当session调用close()方法时,session的缓存被清空;session在清空缓存时会自动进行脏检查,如果发现session缓存中的对象与数据库中相应记录不一致,会根据对象的最新属性去同步更新数据库。b) 当session缓存中的对象属性每次发生变化,session并不会立即清理缓存并执行相关的SQL update语句,而是在特定的时间点才清理缓存,以提高数据访问性能。c) sess
44、ion清理缓存时,按照一下顺序执行SQL语句:按照应用程序调用save()方法的先后顺序,执行所有对实体进行插入的insert语句。执行所有对实体进行更新的update语句。执行所有对实体进行删除的delete语句。执行所有对集合元素进行删除、更新或插入的SQL语句。按照应用程序调用delete()方法的先后顺序,执行所有对实体进行删除的delete语句。d) 在默认情况下,session会在以下时间点清理缓存:当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法先清理缓存,然后向数据库提交事物,可以缩短当前事物对数据库中相关资源的锁定
45、时间。当应用程序执行查询操作时,如果缓存中持久化对象的属性已经发生变化,就会先清理缓存,使得session缓存与数据库已进行了同步,从而保证查询结果的正确性。当应用程序显式的调用了session的flush()方法的时候。e) 如果不希望session在默认的时间点清理缓存,可以通过session的setFlushMode()方法来显式的设定清理缓存的时间点。FlushMode类定义的3种不同的清理模式: FlushMode.AUTO(默认)、FlushMode.COMMIT和FlushMode.NEVER。(看下表)清理缓存模式各种查询方法commit()方法flush()方法FlushMo
46、de.AUTO清理清理清理FlushMode.COMMIT不清理清理清理FlushMode.NEVER不清理不清理清理f) session缓存的三大作用:减少访问数据库的频率。当缓存中的持久化对象之间存在循环关联时,session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。保证数据库中的记录与缓存中的相应对象保持同步。(2) 持久化对象在Hibernate持久化层的状态a) 临时状态:刚刚用new语句创建,还没有被持久化,并且不处于session缓存中。b) 持久化状态:已经被持久化,并且加入session缓存中。c) 删除状态:不处于session缓存中,并且ses
47、sion已经计划将其从数据库中删除。d) 游离状态:已经被持久化,但不处于session缓存中。(3) 持久化对象的各种状态的特征a) 临时对象的特征:在使用代理主键情况下,OID通常为null。不处于session缓存中,不被任何一个session实例关联。在数据库中没有对应的记录。b) 持久化对象的特征:OID不为null。位于session缓存中。持久化对象和数据库中有相关记录对应。session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库。当一个持久化对象关联一个临时对象,在允许级联保存的情况下,session在清理缓存的时会把这个临时对象转变成持久化对象。session
48、的save()方法吧临时对象转化成持久化对象。session的load()或get()方法的返回对象总是处于持久化状态。Query的list()方法返回的List集合中存放的都是持久化对象。session的update()、saveOrUpdate()、lock()方法使游离对象转化为持久化对象。c) 被删除对象的特征:OID不为null。从一个session实例的缓存中删除。被删除和数据库中的相关记录对应。session已经计划将其从数据库中删除。 session在清理缓存时,会执行SQL delete语句,删除数据库中的相应记录。d) 游离对象的特征:OID不为null。不在session
49、缓存中。游离对象是由持久化对象转变过来的,因此在数据库中可能还存在于它对应的记录。session的evict()方法能够从缓存中清除一个持久化对象,使之变为游离状态。session的clear()方法能够清除缓存中的所有持久化对象,使它们变为游离对象。(4) Session接口的详细用法a) save()方法:使用该方法Hibernate会完成以下操作,把持久化对象加入session缓存中,使它进入持久化状态。选用映射文件指定的标识符生成器为持久换对象分配唯一的OID。计划执行一个insert语句,把持久化对象的当前属性值装到insert语句中。b) load()与get()方法:load与g
50、et都能更具给定的OID从数据库加载一个持久化对象,它们的区别在于当数据库不存在与OID对应的记录时,load方法会抛出异常,而get方法返回null。在默认情况下,所有的持久化类都采用延迟检索方式,即<class>节点的lazy属性去默认值“true”,则load方法会采用延迟检索策略加载持久化对象,除非把lazy的值设置成“false”,load方法才会采用立即检索策略。而get方法会忽略lazy的值,总是采用立即检索。如果加载一个对象的目的是为了访问它的各个属性,一般用get()方法。如果加载一个对象的目的是为了删除它,或为了建立与别的对象的关联关系,一般使用load()方法
51、。c) update()方法:该方法会完成以下操作,把游离对象加到session缓存中,使它变成持久化对象,并计划执行一条update语句。d) saveOrUpdate()方法:如果传入的参数是临时对象就执行save()方法,如果传入的参数是游离对象就执行update()方法,如果传入的参数是持久化对象就直接返回。e) merge()方法:该方法把一个游离对象的属性复制到一个持久化对象中。该方法的处理流程如下,根据游离对象的OID到session缓存中查找匹配的持久化对象,然后把游离对象的属性值复制到持久化对象中,计划执行一条update语句,再返回持久化对象;如果在session缓存中没有
52、找到对应的持久化对象,就会到数据库中加载;如果数据库中也没有对应的记录,就会创建一个对象复制游离对象的属性值,再调用save()方法保存这个对象。 f) delete()方法:用于从数据库中删除一个对象。处理流程如下,如果传入的参数是游离对象,先使游离对象变为持久化对象;计划执行一条delete语句;把对象从session缓存中删除,该对象变为删除状态。(5) 级联操作对象图a) 在对象-关系映射文件中,用于映射持久化对象之间关联关系的节点元素,如:<set>、<many-to-one>、<one-to-one>元素,都有一个cascade属性,它用于指定如
53、何操作与当前对象关联的其它对象。b) 下表列出了cascade属性所有的可选值:cascade属性值描述none当session操作当前对象时忽略其它关联对象。它是cascade的默认值。save-update当通过session的save()、update()、saveOrUpdate()方法保存或更新当前对象时,级联保存所有关联的临时对象,并且级联更新所有关联的游离对象。delete当通过session的delete()方法删除当前对象时,会级联删除所有关联的对象。lock当通过session的lock()方法把当前的游离对象加入到session缓存时,会把所有的关联游离对象加入到sess
54、ion缓存中。evict当通过evict()方法从session缓存中清除当前对象时,会级联清除所有关联的对象。refresh当通过session的refresh()方法刷新当前对象时,会级联刷新所有关联的对象。所谓刷新是指读取数据库中相应的数据,然后根据数据库中最新数据去同步更新session缓存中的相应对象。all包含save-update、delete、lock、evict、refresh的行为。delete-orphan删除所有和当前对象解除关联关系的对象。all-delete-orphan包含all和delete-orphan的行为。(6) 批量处理数据a) 一般来说,应该尽可能的避
55、免在应用程序中进行批量操作,而应该在数据库中直接进行批量操作。当然,在应用程序中也可以进行批量操作,主要有三种方式:通过session处理;通过StatelessSession处理;通过HQL处理。b) 通过session进行批量操作:如果通过session来处理大量持久化对象,应及时从缓存中清空已处理完毕且不再访问的对象。具体做法是,在处理完一小批对象后,立刻调用flush()方法清理缓存,然后再调用clear()方法清空缓存。通过session处理会受到以下约束:需要在Hibernate的配置文件中设置JDBC单次批量处理的数目,合理的值通常在1050之间,如hibernate.jdbc.
56、batch_size=20。如果对象采用“identity”标识符生成器,则Hibernate无法再JDBC层进行批量插入操作。进行批量操作是建议关闭Hibernate的二级缓存,因为打开的二级缓存后,所有在一级缓存所做的操作还会在二级缓存中再做一遍,这会影响程序的运行性能。(session的缓存是Hibernate的一级缓存,通常它是事务范围内的缓存,也就是说每个事务都有单独的一级缓存。SessionFactory的外置缓存为Hibernate的二级缓存,它是应用范围内的缓存,也就是说所有事务共享一个二级缓存。在任何情况下,Hibernate的一级缓存总是可用的。Hibernate的二级缓存
57、默认是关闭的,可以在Hibernate配置文件中设置关闭二级缓存,如:hibernate.cache.use_second_leve_cache=false)c) 通过StatelessSession来进行批量操作:StatelessSession与Session很相似,所以操作代码基本相同。StatelessSession与Session有以下区别:StatelessSession没有缓存,通过StatelessSession来加载、保存、更新后的对象都处于游离状态。StatelessSession不会与Hibernate的二级缓存交互。当调用StatelessSession的save()、
58、update()、delete()方法时,这些方法会立即执行执行相应的SQL语句,而不会仅计划执行一条SQL语句。StatelessSession不会对所加载的对象自动进行脏检查,所以修改了已加载的持久化对象后,还要通过其update()方法进行更新数据库中的相应数据。StatelessSession不会对关联对象进行任何级联操作。通过同一个StatelessSession对象两次加载某个OID时,会得到两个具有不同内存地址的持久化对象。d) 通过HQL来进行批量操作:使用HQL批量操作实际上直接在数据库中完成,所处理的数据不会被保存在Session的缓存中,因此不会占用内存空间。(7) Hi
59、bernate的检索策略和检索方式a) 除了立即检索策略,Hibernate提供了其他两种检索策略:延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用SQL的外连接查询功能,能减少select语句的数目。b) Hibernate为应用程序提供的3种检索方式:HQL检索方式,通过Query接口和HQL查询语言检索数据库的数据。QBC检索方式,通过Criteria等接口来检索数据库的数据。本地SQL检索方式,通过本地的SQL语言检索数据库的数据。c) Hibernate的3种检索策略的运行机制检索策略的类型类级别关联级别立即检索立即加载检索方法指定的对象立即加载与检索方法指定的对象所关联的对象延迟检索延迟加载检索方法指定的对象延迟加载与检索方法质地的对象所关联的对象迫切左外连接检索不适用通过左外连接加载与检索方法指定的对象所关联的对象d) 在对象-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年滁州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解ab卷
- 2026年揭阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(达标题)
- 2026年荆州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(综合题)
- 辅警招聘考试备考题库(含答案)
- 2025年护理应聘试题及答案
- 2025年基础护理考试题目及答案
- 2025年特种设备起重机作业人员理论考试笔试试题附答案
- 新生儿病房试题(附答案)
- 中华人民共和国行政处罚法试题题库含答案
- 污废水处理设施运行管理试题(附答案)
- 工厂介绍文案
- 管路维修培训课件模板
- 辨析wear-be-in-dress-put-on-配套课件
- 因公出国人员审查表
- GB/T 42698-2023纺织品防透视性能的检测和评价
- 髋臼及股骨骨缺损的分型及评价-课件
- 物流统计与实务PPT完整版全套教学课件
- 减少老年住院患者口服药缺陷次数的pdca案例
- 护理安全警示教育
- 草诀百韵歌原文及译文
- GB/T 12970.4-2009电工软铜绞线第4部分:铜电刷线
评论
0/150
提交评论