Java容器管理的事务

时间:2014-06-25 13:53:31

标签: 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一致 - > 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之后,所有代码才会被提交到数据库。

0 个答案:

没有答案