java - Spring JPA 的 "refreshing"实体后未反射(reflect)更改

标签 java orm spring-data-jpa jpa-2.1

我正在努力尝试“刷新”一个如下所示的实体(Foo):

public class Foo {

    //...
    @OneToMany(mappedBy = "fooRef", fetch = FetchType.LAZY)
    private List<Bar> bars;
}


public class Bar {

    //...
    @Column(name = "FOO_ID")
    private Long fooRef;
    @Column(name = "STATE")
    @Enumerated(EnumType.STRING)
    private State state;
}

Spring JPA doesn't implement the refresh method ,我只是再次查询该实体。这是不起作用的代码,我不知道为什么:

for(int i=0; i<MAX_RETRIES; i++) {

    List<Bar> bars = foo.getBars();

    // check bars state

    if(someBarIsBad) {
        try {
            TimeUnit.SECONDS.sleep(delay);
        } catch (InterruptedException ignored) {

        }
    } else {
        break;
    }

    foo = fooRepo.findById(fooId);  // "refresh"
}

目标是继续重试,直到所有条都达到所需状态。 我正在进行的测试是在循环的最后一条指令处放置一个断点,因此当它中断时,我会转到表并将所有条的状态更改为所需的状态,然后退出循环。问题是,新返回的 foobars 并没有反射(reflect)我所做的更改。

我尝试删除 sleep ,但这不是问题。我认为这一定与映射有关。

最佳答案

这很可能是因为所有内容都在单个事务中运行。这会导致 JPA 不会从数据库重新加载实体,而是返回 session 中已有的实体。

要么确保每次“刷新”时都处于新事务中,要么从 session 中逐出实体,因此必须再次重新加载实体。

关于java - Spring JPA 的 "refreshing"实体后未反射(reflect)更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600539/

相关文章:

php - 鉴别器列可以成为 Doctrine2 中主键的一部分吗?

python - Django 中唯一标识多对多关系

mysql - JPQL 中的成员未转换为 SQL 存在子句

jpa - 如何使用 Spring Data JPA 持久保存 JSR-310 类型?

java - Spring数据复杂查询创建

java - 如何在Google Map中设置几个特定位置?

python - Django ORM 魔法。错误还是功能?

java - ubuntu 上的开普勒 glassfish

java - TextView 不会更改为新设置的文本

java - 将数组插入 Excel