我遇到了问题,我无法弄清楚原因。对于帖子的其余部分,我们假设每个事务都是容器管理的,我们使用jboss AS 7.X.我们有三个无国籍的ejb。我们将其称为RestEJB,IntEJB和ProviderEJB。提供者基础方法是:
save(){
return getEm().merge(ob);
加载方法的核心是:
load(){
Query query = getEm().createQuery(criteriaQuery);
基本顺序与RestEJB一致 - > IntEJB - > ProviderEJB。
现在,根据操作的顺序,我们可能会在jboss中收到ARJUNA012117错误。
有问题的代码是:
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)
}
然后一切都会正常运作。在上面的示例中,item表示相同的Object。因此,保存和加载是在同一对象上完成的(这可能反过来触发其他提取)。在任一示例中都没有在保存和加载之间编写代码。
问题是:当我们将负载移动一个ejb而不是加载到与保存相同的级别ejb时,它是如何工作的? 由于我们使用了hibernate,因此只有在退出RestEJB之后,所有代码才会被提交到数据库。