Hibernate二级缓存更新

标签 hibernate caching jpa jboss second-level-cache

我有以下问题。 我使用 JBoss 5.1、JPA/Hibernate 和二级缓存。 我的系统几乎没有映射相同数据库表的实体。 例子: 表 FURNITURES 由实体“Furn”和“Furniture”映射。

这些类无法更改。

现在,当我更改 id 为 1 的“家具”的数据时,id 为 1 的“家具”仍然具有旧数据。 “Furn”更新后是否有可能驱逐“Furniture”?

最佳答案

当您更新/删除对象时,系统会向缓存层发送通知以反射(reflect)这些更改。

缓存 key 甚至可能被广播到另一台服务器,因此它必须携带足够的有效负载,以便为远程端提供足够的信息来刷新相关条目。但另一方面,为了最大化吞吐量,它也不能太大。

如果您打开调试,您将看到以下结构(它可能会根据您的持久对象类型、标识符 - 复合或非复合等而有所不同):

cacheKey = {org.hibernate.cache.CacheKey}
|- key = {your.own.serializable.class}
|- type = {org.hibernate.type.ComponentType}
| |- typeScope = {org.hibernate.type.TypeFactory$TypeScopeImpl}
| | |- factory = {org.hibernate.impl.SessionFactoryImpl}
| |- propertyNames = {...}
| |- propertyTypes = {...}
| |- propertyNullability = {...}
| |- propertySpan = 2
| |- cascade = {...}
| |- joinedFetch = {...}
| |- isKey = true
| |- tuplizerMapping = {...}
|- entityOrRoleName = {java.lang.String} "my.Entity"
|- entityMode = {org.hibernate.EntityMode}
|- hashCode = 588688

正如你所看到的,Hibernate 缓存键存储有关类名、id 类型等的信息。如果你有两种不同的类型,它们将被映射到两个不同的缓存键,因此你的问题。

为了解决这个问题,您可以为两个实体创建 DAO 类,并确保所有持久化这些实体的调用仅通过它们而不是其他地方。然后,在两个条目的 update/delete 方法中,只需加载和逐出另一个实体即可。

另一个选择是使用 interceptors这可以帮助实现相同的功能,但根据我的口味,DAO 路径更干净。

关于Hibernate二级缓存更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13118106/

相关文章:

java - Hibernate 返回不匹配的行

java - 在jpa实体中使用json字段(实现hibernate UserType)

caching - Nginx proxy_buffer_size 不足以容纳缓存键

google-apps-script - 在 UrlFetchApp 中缓存

hibernate - 正确使用JPA标准API,谓词以及CriteriaQuery的where方法

java - hibernate保存中的可序列化字符串(对象实体,可序列化id)

java - 同步spring事务

php - 如何在 yii2 ActiveRecord 中使用查询缓存

java - 在一对多关系中获取表中的重复条目

java - 为什么我不能将 java.util.Date 与 mysql 日期进行比较?