Hibernate配置要点详谈

开发 后端
本文一共介绍了27点Hibernate的配置要点,继续了解请看下文。

1.两种配置文件:

A.hibernate.cfg.xml和B.hibernate.properties

A中可含映射文件的配置,而B中hard codes加映射文件。

A.Configuration config=new Configuration().config();

B.Configuration config=new Configuration();

config.addClass(TUser.class);

2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名,你也不一定非得把配置文件放在Classes下,

  1. File file=new File("c://sample//myhibernate.xml");  
  2. Configuration config=new Configuration().config(file);  

3. session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush在session关闭时也会调用flush

4. Hibernate总是使用对象类型作为字段类型

5. XDoclet专门建立了hibernate doclet,就是在java代码上加上一些java docTag,后来再让XDoclet分析该java代码,生成映射文件;

6.HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

7.关系:Constrained:约束,表明主控表的主键上是否存在一个外键(foreigh key)对其进行约束。

property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名

单向一对多需在一方配置,双向一对多需在双方进行配置

8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控方指定的Collection类型属性中

9. java.util.Set或net.sof.hibernate.collecton.Bag类型的Collection

10.重要:inverse:用于标识双向关联中的被动方一端。

inverse=false的一方(主控方)负责维护关联关系.默认值:false

11.batch-size:采用延迟加载特征时,一次读入的数据数昨。

12.一对多通过主控方更新(主控方为一方时)

  1. user.getAddresses().add(addr); session.save(user);//通过主控对象级联更新 

13.在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能的改善。在一方设置关系时,inverse=true,即将主控权交给多方,  这样多方可主动从一方获得foreign key,然后一次insert即可完工。

  1. addr.setUser(user);//设置关联的TUser对象   
  2. user.getAddresses().add(addr);  
  3. session.save(user);//级联更新 

14.只有设为主控方的一方才关心(访问)对方的属性,被动方是不关心对方的属性的。

15.one-to-many与many-to-one节点的配置属性不同:

一对多关系多了lazy和inverse两个属性多对多节点属性:

column:中间映射表中,关联目标表的关联字段

class:类名,关联目标类

outer-join:是否使用外联接

注意:access是设置属性值的读取方式。

column是设置关联字段。

16.多对多,注意两方都要设置inverse和lazy,cascade只能设为insert-update

多对多关系中,由于关联关系是两张表相互引用,因此在保存关系状态时必须对双方同时保存。

  1. group1.getRoles().add(role1);  
  2.  
  3. role1.getGroups().add(group1);   
  4.  
  5. session.save(role1);  
  6.  
  7. session.save(group1);  

17.关于vo和po

vo经过hibernate容量处理,就变成了po(该vo的引用将被容器保存,并且在session关闭时flush,因此po如果再传到其它地方改变了,就危险了)    vo和po相互转换:BeanUtils.copyProperties(anotherUser,user);

18.对于save操作而言,如果对象已经与Session相关联(即已经被加入Session的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate 会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成并执行相应的update 语句。

19.如果我们采用了延迟加载机制,但希望在一些情况下,实现非延迟加 载时的功能,也就是说,我们希望在Session关闭后,依然允许操作user的addresses 属性 Hibernate.initialize方法可以通过强制加载关联对象实现这一功能: 这也正是我们为什么在编写POJO时,必须用JDK Collection接口(如Set,Map), 而非特定的JDK Collection实现类(如HashSet、HashMap)申明Collection属性的 原因。

20.事务:从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了jdbc操作,如果不显式调用session.BeginTransaction(),是不会执行事务操作的。

jdbc transaction:基于同一个session(就是同一个connection)的事务;

jta transaction:跨session(跨connection)事务.

对于jta事务,有三种实现方法:

A、

  1. UserTransaction tx=new InitialContext().lookup("...");   
  2. tx.commit();  

B、使用hibernate封装的方法:(不推荐)

  1. Transaction tx=session.beginTransaction();   
  2. tx.commit();  

C、使用ejb之sessionBean的事务技持方法,你只要在把需要在发布描述符中,把需要jta事务的方法声明为require即可

21.悲观锁,乐观锁:

乐观锁一般通过version来实现,注意version节点必须出现在id后。

22.Hibernate中,可以通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围。

Query接口中也提供了与其一致的方法,hibernate主要在dialect类中实现在这个功能。

23.

  1. cache   
  2. ……   
  3. net.sf.ehcache.hibernate.Provider  

还需对ecache本身进配置

之后在映射文件中指定各个映射实体的cache策略

....

*****************************************************

Query.list()跟Query.iterate()的不同: 对于query.list()总是通过一条sql语句获取所有记录,然后将其读出,填入pojo返回; 但是query.iterate(),则是首先通过一条Select SQL 获取所有符合查询条件的记录的 id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记 录,之后填入POJO中返回。

也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1 条SQL。list方法将不会从Cache中读取数据。iterator却会。

24.ThreadLocal:它会为每个线程维护一个私有的变量空间。实际上, 其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是 线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时, ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回。

这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开来。

25.Hibernate官方开发手册标准示例:

  1. public class HibernateUtil {   
  2. private static SessionFactory sessionFactory;   
  3. static {   
  4. try {  
  5. // Create the SessionFactory sessionFactory =  
  6. new Configuration().configure().buildSessionFactory();  
  7.  } catch (HibernateException ex)  
  8. {  
  9. throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex );  
  10.  }  
  11.  }  
  12. public static final ThreadLocal session = new ThreadLocal();  
  13. public static Session currentSession() throws HibernateException {  
  14. Session s = (Session) session.get();   
  15. // Open a new Session, if this Thread has none yet if (s == null) {  
  16. s = sessionFactory.openSession(); session.set(s);  
  17. }  
  18. return s;   
  19. }   
  20. public static void closeSession() throws HibernateException  
  21. {  
  22. Session s = (Session) session.get();  
  23. session.set(null);  
  24. if (s != null) s.close();  
  25. }  

26.通过filter实现session的重用:

  1. public class PersistenceFilter implements Filter {  
  2. protected static ThreadLocal hibernateHolder = new ThreadLocal();  
  3. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  4. throws IOException, ServletException{  
  5. hibernateHolder.set(getSession());  
  6. try {  
  7. ……  
  8. chain.doFilter(request, response);  
  9. ……  
  10. }  
  11. finally {  
  12. Session sess = (Session)hibernateHolder.get();  
  13. if (sess != null) {  
  14. hibernateHolder.set(null);  
  15. try {  
  16. sess.close();  
  17. }  
  18. catch (HibernateException ex) {  
  19. throw new ServletException(ex);  
  20. }  
  21. }  
  22. }  
  23. }  
  24. ……  

27.Spring的参数化事务管理功能相当强大,笔者建议在基于Spring Framework的应用 开发中,尽量使用容器管理事务,以获得数据逻辑代码的***可读性。

  1. public class UserDAO extends HibernateDaoSupport implements IUserDAO {  
  2. public void insertUser(User user){  
  3. getHibernateTemplate().saveOrUpdate(user);  
  4. }  

上面的UserDAO实现了自定义的IUserDAO接口,并扩展了抽象类:

HibernateDaoSupport HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联。

HibernateTemplate对Hibernate Session操作进行了封装,而 HibernateTemplate.execute方法则是一封装机制的核心

*在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。

原文链接:http://blog.csdn.net/ysynlm/article/details/2766614

【编辑推荐】

  1. Hibernate配置文件和映射元素解释
  2. 详解Hibernate拦截器与事件监听器
  3. Hibernate的缓存解读
  4. Hibernate的集合映射
  5. Hibernate关联关系配置
责任编辑:林师授 来源: ysynlm的博客
相关推荐

2015-05-05 11:06:02

JavaJava框架Struts+Hibe

2009-06-26 16:09:21

Hibernate查询HQL

2012-02-03 10:54:50

HibernateJava

2009-09-27 14:24:10

Hibernate配置

2009-09-22 15:04:37

Hibernate M

2009-09-23 14:00:07

Hibernate连接

2016-12-15 08:38:50

1 Hibernate基本配置

2009-09-22 10:23:15

Hibernate配置

2009-09-24 15:03:30

Hibernate配置

2009-09-27 13:25:22

2009-06-17 16:22:45

Hibernate连接

2009-09-29 15:52:26

Hibernate X

2009-09-22 14:44:18

Hibernate.c

2009-09-29 17:29:43

Hibernate S

2009-09-22 16:04:50

Hibernate连接

2009-06-29 08:50:20

Hibernate主键

2009-09-25 10:49:25

Hibernate加载

2013-01-04 13:22:42

OpenFlowSDN

2012-12-18 16:22:36

2009-11-17 15:13:28

PHP数组
点赞
收藏

51CTO技术栈公众号