gpt4 book ai didi

Hibernate 二级缓存更新

转载 作者:行者123 更新时间:2023-12-02 22:24:52 25 4
gpt4 key购买 nike

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

不能更改这些类。

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

最佳答案

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

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com