扩展的持久化上下文问题

09-03-20 forever1127
普通的一次请求一个session的方式,在WEB开发中存在一些问题,比如一个业务会话要经过几个请求,各个请求都对数据库进行插入或更新,如果要保证在一个业务会话中完成所有操作,保证原子性,那么就需要采用扩展的持久化上下文来做.这里想问下关于扩展的持久化上下文的实现机制,是不是一个业务会话就采用一个长JTA事务,否则如果一个请求一个事务的话,那么数据必然会提交到数据库.这样也就是扩展的持久化上下文是依靠JTA事务作为载体来传播的,当 JTA事务结束了,持久化上下文也结束了!不知道这样理解是否正确,请详细解答下!谢谢

另外:

在论坛有个帖子是专门说了关于持久化上下文的

里面利用hibernate作为持久化提供者.通过以下设置

@PersistenceContext(type=PersistenceContextType.EXTENDE,

propertites = @PersistenceProperty(name="org.hibernate.flushMode", value="MANUAL")

这样就可以在一个会话中手动提交了,但是我想问的是这里几个请求之间是通过一个JTA长事务进行的吗?还是一个请求一个!最终导致的不写数据库是不是就是因为事务一直不提交的缘故!

[该贴被forever1127于2009-03-20 10:17修改过]

xmuzyu
2009-03-20 13:04
还是一个请求过来会开启一个事物,但是持久化上下文的刷新模式改变了,这样事务结束后就不会同步持久化上下文与数据库了。只所以采用这个hibernate扩展是因为当前JPA规范不够完善,没有支持手动刷新持久化上下文的选项,如果按照JPA规范的做法,那么就要采用非事务的访问,但是采用非事务的访问的时候,持久化上下文有没有办法传播。

其实这种情况也可以采用detached object来实现,通过hibernate/JPA提供的merge和reattch操作(JPA只支持merge).

forever1127
2009-03-20 13:16
感谢!大体了解了,能方便提供下您的联系方式吗?我的油箱是xmh19840928@yahoo.com.cn 有些问题想请教一下您

oojdon
2009-03-21 00:27
呵呵,加入我们的15230356框架讨论群吧

猜你喜欢