Java容器管理事务
我遇到了一个问题,我无法找出原因。在本文的其余部分,我们将假设每个事务都是容器管理的,并且我们使用jboss AS 7.X。我们有三个无状态ejb。我们将它们称为RestEJB、IntEJB和ProviderEJB。提供程序基方法包括:Java容器管理事务,java,hibernate,jpa,transactions,ejb,Java,Hibernate,Jpa,Transactions,Ejb,我遇到了一个问题,我无法找出原因。在本文的其余部分,我们将假设每个事务都是容器管理的,并且我们使用jboss AS 7.X。我们有三个无状态ejb。我们将它们称为RestEJB、IntEJB和ProviderEJB。提供程序基方法包括: save(){ return getEm().merge(ob); 荷载法的核心线为: load(){ Query query = getEm().createQuery(criteriaQuery); 基本顺序是RestEJB->IntEJ
save(){
return getEm().merge(ob);
荷载法的核心线为:
load(){
Query query = getEm().createQuery(criteriaQuery);
基本顺序是RestEJB->IntEJB->providerjb
现在,根据操作的顺序,我们可能会在jboss中收到arjuna01217错误
问题代码如下:
RestEJB.someMethod(){
item = IntEJB.save(item)
}
IntEJB.save(Item item){
...
ProviderEJB.save(item)
return ProviderEJB.load(item)
}
但是如果我们这样重写它:
RestEJB.someMethod(){
item = IntEJB.save(item)
item = IntEJB.load(item)
}
IntEJB.save(){
...
return ProviderEJB.save(item)
}
IntEJB.load(){
...
return ProviderEJB.load(item)
}
然后一切都会正常工作。在上述示例中,项表示相同的对象。因此,保存和加载是在同一个对象上完成的,这反过来可能会触发其他获取。在这两个示例中,都没有在save和load之间编写代码
问题是:当我们将加载一个ejb向上移动,而不是在与保存相同级别的ejb上加载时,它是如何工作的?
由于我们使用hibernate,所有代码只有在退出RestEJB后才会提交到数据库。您的代码片段没有多大意义,请显示实际的代码,即使您正在更改名称也可以。我不会显示实际代码,因为我不拥有itA。快速修复方法是在ProviderEJB.saveitem上添加@TransactionAttributetTransactionAttributeType.REQUIRES\u NEW以强制它在其他事务上执行是的,我同意。如果它在不同的事务中执行,那么它将看到更改。但是,为什么加载与保存不在同一事务中工作?加载时,它通常尝试从缓存或数据库刷新实体的状态,并且由于当前事务尚未完成,因此尚未提交保存