使用Spring JPA“刷新”实体后未反映的更改

时间:2018-05-30 09:01:17

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

我正在努力“刷新”一个看起来像这样的实体(Foo):

NotificationCompat.Builder builder = new NotificationCompat.Builder(Activity)
            .SetAutoCancel(true)
            .SetContentIntent(resultPendingIntent)
            .SetContentTitle("My Notifications")
            .SetContentText(" Work dammit -_-");
            NotificationManager notificationManager = (NotificationManager)Activity.GetSystemService(Android.Content.Context.NotificationService);
            notificationManager.Notify(ButtonClickNotification, builder.Build());

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

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" } foo并未反映我所做的更改。

我试图移除睡眠,但这不是问题。我认为它必须与映射有关。

1 个答案:

答案 0 :(得分:1)

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

确保您永远处于新交易状态&#34;刷新&#34;或者从会话中逐出实体,因此必须重新加载。