Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java容器管理事务_Java_Hibernate_Jpa_Transactions_Ejb - Fatal编程技术网

Java容器管理事务

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

我遇到了一个问题,我无法找出原因。在本文的其余部分,我们将假设每个事务都是容器管理的,并且我们使用jboss AS 7.X。我们有三个无状态ejb。我们将它们称为RestEJB、IntEJB和ProviderEJB。提供程序基方法包括:

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以强制它在其他事务上执行是的,我同意。如果它在不同的事务中执行,那么它将看到更改。但是,为什么加载与保存不在同一事务中工作?加载时,它通常尝试从缓存或数据库刷新实体的状态,并且由于当前事务尚未完成,因此尚未提交保存