我正在使用扩展的持久性上下文(在 SFSB 注入 Entitymanager),并且还@TransactionManagement(value=TransactionManagementType.BEAN)
为 SFSB 设置了对UserTransaction
.
事务在客户端控制,我在客户端开始查找包含对实体 bean 的引用的 SFSB。
SymbolischeWerte sbw = (SymbolischeWerte)symbolischeWerteHome.findByPrimaryKey(BigDecimal.valueOf(24704578762l));
System.out.println(symbolischeWerteHome.getSEQ_ID() + "\t\t" + symbolischeWerteHome.getName());
symbolischeWerteHome.beginTransaction();
symbolischeWerteHome.setName(symbolischeWerteHome.getName().concat("A"));
symbolischeWerteHome.commitTransaction();
到目前为止有效!
在启用 JBoss Cache 和多个客户端后,只有第一个客户端会导致数据库选择。其他人从缓存中获取实体。
完美的!
问题:
2个客户端(CLIENTA,CLIENTB)同时查找具有相同主键的实体,而CLIENTA运行程序,CLIENTB在findByPrimaryKey后手动停止。当 CLIENTA 完成(值被成功持久化)时,CLIENTB 的系统输出显示旧值,该值也被修改并存储到数据库中。
所以我正在失去 CLIENTA 的价值观!!
这是 JBoss Cache 配置问题还是我的系统设计的一般问题?
实体的缓存配置:
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL, region="com.culturall.pension.system.SymbolischeWerteEntity")
在 persistence.xml 中缓存配置
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/>
<property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/>
<property name="hibernate.cache.region.jbc2.cfg.query" value="local-query"/>
感谢您的任何建议!