jdon框架整合hibernate后的事务处理

08-11-10 oojdon
         

默认的事务边界是延伸到了表现层渲染之后,如果我想把数据库事务完全控制在业务层的话,如下代码:

public void createTopicMessage(EventModel em) throws Exception {

logger.debug(" enter service: createMessage ");
ForumMessage forumMessage = (ForumMessage)em.getModelIF();
Forum forum = forumBuilder.getForum(forumMessage.getForum().getForumId());
if (forum == null){
logger.error(" no this forum, forumId = " + forumMessage.getForum().getForumId());
em.setErrors(Constants.ERRORS);
return;
}
forumMessage.setForum(forum);
TransactionManager tx = jtaTransactionUtil.getTransactionManager();
try {
tx.begin();
ForumThread forumThread = super.createThread(forumMessage);
forumMessage.setForumThread(forumThread);
messageDaoFacade.getMessageDao().createMessage(forumMessage);
tx.commit();
} catch (Exception e) {
logger.error(e);
jtaTransactionUtil.rollback(tx);
throw new Exception(e);
}
}

session是否会在JTA事务结束之后关闭?如果会,那就避免不了LazyInitializationException异常了,要解决它又回到OSIV。


[该贴被oojdon于2008-11-10 17:30修改过]

         

banq
2008-11-10 17:30

CloseSessionIbView如果Session没有关闭,进行关闭。

你可以在事务内自己关闭session

oojdon
2008-11-10 17:44

session都是期望它在表现层渲染完成之后关闭,所以还是交给CloseSessionInView,关键是事务,如果不是JTA事务,直接交给hibernate就行了,但是事务边界是固定的,要自己控制事务边界又期望sessin保持打开,我现在似乎模模糊糊的理解了spring的良苦用心,就OpenSessionInView了,爱用不用,高手们知道有问题,但是菜鸟们不好意思,我spring没有照顾好你们!!

banq
2008-11-10 18:01

可以使用flush ,将缓存和数据库同步一下就可以,不必关闭Session

如果你不想手工flush,让Hibernate自动flush,必须配置Hibernate的hibernate.transaction.manager_lookup_class 和 hibernate.transaction.factory_class
不是让Hibernate启动事务,而是让他自动侦测,他如果发现事务关闭,会自动auto flush

这些和Spring 的OSIV,没有关系,不要瞎猜,要理解原理,这里一篇文章:

http://blog.xebia.com/2008/07/18/configuring-hibernate-and-spring-for-jta/
[该贴被banq于2008-11-10 18:14修改过]

oojdon
2008-11-10 18:43

好文章,谢谢
我把jivejdon用jboss再测试一下

3Go 1 2 3 下一页