Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate Play Framework-JPA嵌套事务不工作_Hibernate_Jpa_Playframework_Transactions_Playframework 2.0 - Fatal编程技术网

Hibernate Play Framework-JPA嵌套事务不工作

Hibernate Play Framework-JPA嵌套事务不工作,hibernate,jpa,playframework,transactions,playframework-2.0,Hibernate,Jpa,Playframework,Transactions,Playframework 2.0,我将PlayFramework2.5.1与javaJPA一起使用,似乎嵌套的事务没有按规定工作 public TransactionEntity saveTransaction(TrasactionForm form) { return japApi.withTransaction(() -> { //outer transaction TransactionEntity t = jpaApi.withTransaction(() -> { //inner t

我将PlayFramework2.5.1与javaJPA一起使用,似乎嵌套的事务没有按规定工作

public TransactionEntity saveTransaction(TrasactionForm form) {
    return japApi.withTransaction(() -> { //outer transaction
        TransactionEntity t = jpaApi.withTransaction(() -> { //inner transaction
            TransactionEntity entity = form.toEntity();
            return txnDao.saveTransaction(entity);
        });
    return txnDao.getTransaction(entity.id); //should get the transaction from db, but throws exception saying no entity found
    });
}
实际情况比上述例子稍微复杂一些。我有一个外部事务,在嵌套事务中保存一个实体,并尝试在外部事务中获取just save事务,而不是获取它,hibernate抛出实体未发现异常。外部事务无法看到内部事务写入数据库

如果我调试并播放JPA和hibernate代码,一切都正常-是因为延迟吗?我认为这不应该发生,因为这是基本的交易原则

我阅读并查看了Play现在支持嵌套事务的代码,但在我的简单案例中,它不起作用


非常感谢您提供的帮助和提示。

看起来您正在创建两个事务,但它们不是具有父事务和子事务的“嵌套事务”

这两个事务同时运行(就像您在两个单独的线程中创建它们一样),但它们是单独的事务。一个事务是否会看到另一个事务的提交值取决于缓存的类型,也可能取决于任何JPA缓存。例如,如果您已经使用JPA在一个事务中读取了一个值,那么即使在另一个事务中提交,它也可能被缓存


如果您想读取一个提交的值,那么可以将它作为普通的Scala值从“内部”事务代码返回到“外部”事务。或者,您可以运行第三个事务来读取值。

感谢您的澄清。这是有点奇怪,它在少数情况下工作,即使有外部事务,在少数情况下失败-无法找出确切的原因-它主要发生在测试案例中-我有一些变通办法,以避免每次构建Play应用程序。这可能就是原因。根据事务隔离级别和底层数据库,我可以想象您在读取行时可能会得到不确定的结果。