2011-03-26 80 views
2

我有两个实体(例如降低尽可能;每个实体有一个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 -objects:

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

你可以粘贴代码来保存X吗? – Premraj 2011-03-26 13:34:34

回答

2

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

0

我试图解决清除缓存的问题,但后来出现了新问题,并且使得缓存或多或少无用,因为X es经常更改。 (事实上​​,子查询比问题中显示的要复杂得多,它使用更多表格)。

现在我使用的是没有第一级缓存的StatelessSession。这解决了这个问题。由于数据库是嵌入式h2-Database,因此性能回归并不明显。