2

你好,我有问题。我的(我猜的)持久层正在缓存我的结果,所以当我从我的应用程序外部更新数据库时,数据仍然是陈旧的。

但是,它只缓存了一半的时间,我希望这是有道理的,

我有一堂课

@Entity
@Table(name = "PROVINCE")
public class Province implements Serializable {

@Id
@GeneratedValue
int id;

String provinceName;

String provinceMoto;


Buildings buildings;


Units units;


Person person;

.... etc

现在,如果我更新任何不是对类对象的引用的数据,例如“provincename”,那么数据在我的应用程序中就可以了,并且会立即更新。但是,像“建筑物”这样的内部对象没有,我无法弄清楚如何,如果我像重新部署我的应用程序一样进行硬刷新,那么数据是新鲜的。

我从这里的数据库中获取我的省份:

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 的必需品,我修复了我之前没有数据更新的问题。以及这里的第一篇文章(这是另一个堆栈溢出页面)

谢谢你的帮助。我希望我能很好地解释我的问题

[编辑:就像我没有使用这个框架一样,加入数据库中的表并将数据重新填充到新变量中会更容易,但我没有]

4

2 回答 2

2

这是一个“当我……时会受伤的医生”“不要那样做”的问题。

如果您在 Toplink 背后更新数据库,那么您必须像以前一样刷新数据。

每次您在 JPA 中使用“选择”类型的查询时,它都会访问数据库。但是,正如您所了解的,对于相关对象,它只会从数据库中提取它们的键,然后使用缓存版本而不是访问数据库。

Toplink 有 2 个缓存。一级和二级缓存。1 级缓存是用于当前会话的基于事务的缓存。2 级缓存类似,但在应用程序范围和全局范围内。2 级缓存是您最有可能遇到的。

因此,您要么需要继续使用 Toplink 刷新提示,要么完全禁用 2 级缓存。

于 2011-03-22T05:56:35.217 回答
0

将数据更新到数据库后,使您的值对象(也是子值对象)或使用默认值重新初始化。希望这能解决您的问题。

于 2011-03-22T05:34:48.297 回答