我有两个实体(示例尽量减少;每个实体都有一个id字段):

@Entity
public class A {
    @Column(nullable = false)
    private double foo;

    @Formula(value = "foo - (select coalesce(sum(x.foo), 0) from x where x.a_id = id)")
    private double bar;
}




@Entity
public class X {
    @ManyToOne(optional = false)
    private A a;

    @Column(nullable = false)
    private double foo;
}


创建新的Xnew X()beginTransaction()save(x)commit())时,A.bar的值不会刷新。

我认为发生这种情况是因为旧的(错误的)值仍在第一级缓存中(没有第二级缓存)。我不想调用Session.clear(),因为此方法似乎会使现有的实体对象无效。我还能做些什么来解决这个问题?

编辑:按要求在这里是保存X-对象的代码:

// setters
getSession().beginTransaction(); // getSession() returns the current session
getSession().save(entity); // entity is an instance of X
getSession().getTransaction().commit();

最佳答案

Session.clear将从会话中删除所有缓存的对象。相反,您可以在会话上使用evict方法并指定一个对象,该对象仅从高速缓存中删除指定的对象。

10-08 17:21