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_Ejb_Ejb 3.0 - Fatal编程技术网

Java 事务提交后未刷新更新查询

Java 事务提交后未刷新更新查询,java,hibernate,jpa,ejb,ejb-3.0,Java,Hibernate,Jpa,Ejb,Ejb 3.0,我有几个扩展BaseRepository的存储库,如下所示: public abstract class IsoRepository<T extends Serializable> { @PersistenceContext protected EntityManager entityManager; public void persist(T obj) { entityManager.persist(obj); } } @Stat

我有几个扩展BaseRepository的存储库,如下所示:

public abstract class IsoRepository<T extends Serializable> {
    @PersistenceContext
    protected EntityManager entityManager;

    public void persist(T obj) {
        entityManager.persist(obj);
    }
}

@Stateless
public class T1Repository extends BaseRepository<T1> {
    // methods depending on repository
}

@Stateless
public class T2Repository extends BaseRepository<T2> {
    public Optional<T2> findByOrderId(String id) {
        return entityManager.createNamedQuery(/* ... */, T2.class)
            .setParameter("id", id).getResultList().stream().findFirst();
    }
}

// and others

问题是所有的insert查询都保存在数据库中,但这一次更新不好。我发现我需要显式调用
entityManager.flush()
,因为这似乎可以解决问题,但我不太明白为什么会发生这种情况。我一直认为,事务提交后,所有数据都会自动刷新。我必须更改配置吗?

根据JPA文档

"persist(Object entity)
Make an instance managed and persistent." 
意味着,persist只能用于插入。通常你应该

"EntityExistsException - if the entity already exists. 
(If the entity already exists, the EntityExistsException may be 
thrown when the persist operation is invoked, or the 
EntityExistsException or another PersistenceException may be thrown at 
flush or commit time.)"
正如文件所述。因此:

    T2 t2 = t2Repository.findById(id);
    t2.setProperty(someProperty);
    t2Repository.persist(t2);
根据JPA的定义,在任何情况下,应立即或在交易结束时导致EntityExistsException。此端点也可以位于自身调用TransactionService.persist的方法的末尾。 此异常在任何情况下都会导致回滚,因此您的更新将永远不会完成

我的建议是:

摆脱persist调用,因为对象在find期间被管理,所以更改将在事务结束时完成


请参阅:

flush()在事务结束时自动调用。您在一个事务内调用t2Repository,并且没有自动刷新功能。“我一直认为,在事务提交之后,所有数据都会自动刷新”--您是对的。但不应该在方法
saveTransaction
完成后调用flush吗?因为现在看起来好像不是(手动调用,因为方法中的最后一个操作有帮助),请显示persistence.xml文件和您的配置方式transaction@xyzMy persistence.xml包含属性
transaction type=“JTA”
@Andreas,因为没有使用
TransactionAttribute
注释对任何方法进行注释,因此,默认情况下设置为
必需
。但事务已提交,因为所有其他数据都已提交。奇怪的是,似乎只有这个表会引起问题,因为在它工作的另一个实体上执行了相同的流——find、change、persist。此外,这个有问题的条目在被HQL查询选中(例如)后也会保存到数据库中。我用这种方式更新了两个实体(find、change、persist)。虽然我没有收到任何异常(Hibernate似乎忽略了这些情况),但一定是出了什么问题。这真的很奇怪,因为一个实体被更新了,而另一个没有更新,但是在删除了两个persist语句之后,一切似乎都正常工作。谢谢
    T2 t2 = t2Repository.findById(id);
    t2.setProperty(someProperty);
    t2Repository.persist(t2);