我有一个班级
@Entity
@Table(name = "PROVINCE")
public class Province implements Serializable {
@Id
@GeneratedValue
int id;
String provinceName;
String provinceMoto;
Buildings buildings;
Units units;
Person person;
.... etc
现在,如果我更新任何不是类对象引用的数据,比如'省名',那么我的应用程序中的数据就可以了,并立即更新。然而,像'建筑'这样的内部对象没有,我无法弄清楚如何,如果我像重新部署我的应用程序一样进行硬刷新,那么数据是新鲜的。
我从数据库中获取我的省份:
Query query = manager.createQuery("select p from Province p where p.person = :query");
query.setHint("toplink.refresh", "true");
query.setParameter("query", p);
province = (Province) query.getSingleResult();
那么我如何强迫它也使该类的内部对象,即“建筑物”'人'也更新。
我的持久层是toplink essentials,我修复了我之前没有数据更新的问题。并且第一篇文章here(it's another stack overflow page)
谢谢你的帮助。我希望我能很好地解释我的问题
[编辑:就像我没有使用这个框架一样,只是更容易加入数据库中的表并在新变量中重新填充数据,但我不是]
答案 0 :(得分:2)
这是“当我......”时“痛苦的医生”。“不要这样做”。
如果您要更新Toplink背面的数据库,那么您必须像对待数据一样刷新数据。
每次在JPA中使用“select”类型查询时,它都会命中数据库。但是,正如您所了解的,对于相关对象,它只是从数据库中提取密钥,然后优先使用缓存版本来访问数据库。
Toplink有2个缓存。 1级和2级缓存。 1级缓存是当前会话的基于事务的缓存使用。 2级缓存类似,但应用程序范围广泛且范围广泛。二级缓存是您最有可能遇到的问题。
因此,您需要继续使用Toplink刷新提示,或者完全禁用Level 2 Cache。
答案 1 :(得分:0)
将数据更新到数据库后,创建您的值对象(也是子值对象)或使用默认值进行重新数据化。希望这会解决你的问题。