使用 Spring JPA 的 "refreshing" 个实体后未反映更改
Changes not reflected after "refreshing" entity with Spring JPA
我正在努力尝试 "refresh" 一个看起来像这样的实体 (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;
}
作为,我只是再次查询实体。这是它不起作用的代码,我不知道为什么:
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"
}
目标是继续重试,直到所有柱状图都达到所需状态。
我正在做的测试是在循环的最后一条指令处放置一个断点,所以当它中断时,我进入 table 并将所有条的状态更改为所需的状态,然后退出循环.问题是新返回的 foo
,bars
没有反映我所做的更改。
我试图删除睡眠,但这不是问题所在。我认为它必须与映射有关。
这很可能是因为单笔交易中的所有内容都是 运行。这会导致 JPA 不从数据库重新加载实体,而是 return 它在会话中已有的实体。
要么确保您在每次“刷新”时都处于新事务中,要么从会话中逐出该实体,因此它必须重新加载。
我正在努力尝试 "refresh" 一个看起来像这样的实体 (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;
}
作为
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"
}
目标是继续重试,直到所有柱状图都达到所需状态。
我正在做的测试是在循环的最后一条指令处放置一个断点,所以当它中断时,我进入 table 并将所有条的状态更改为所需的状态,然后退出循环.问题是新返回的 foo
,bars
没有反映我所做的更改。
我试图删除睡眠,但这不是问题所在。我认为它必须与映射有关。
这很可能是因为单笔交易中的所有内容都是 运行。这会导致 JPA 不从数据库重新加载实体,而是 return 它在会话中已有的实体。
要么确保您在每次“刷新”时都处于新事务中,要么从会话中逐出该实体,因此它必须重新加载。