rol*_*and 2 hibernate hazelcast
传奇:
在应用程序中存在具有下一类级别注释的实体:
@Entity
@Cache( usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE )
@Table( name = "entity", catalog = "main" )
@IdClass( EntityPK.class )
Run Code Online (Sandbox Code Playgroud)
当在第一个实例上对此实体执行数据库更新时, com.hazelcast.nio.serialization.HazelcastSerializationException: org.hibernate.HibernateException: Could not find a SessionFactory [uuid=ee9f3ccd-1f7e-4345-83ed-e58440a52123,name=null]在第二个实例上抛出异常。
调试后,我找到了此异常的原因 - 它在反序列化期间由方法抛出org.hibernate.type.spi.TypeConfiguration.Scope#readResolve。此类的实例是默认 Hibernate 缓存键对象的一部分。
据我了解。导致问题的对象是“会话范围的”。换句话说,它绑定到特定的 SessionFactory 并在其字段中包含会话工厂 UUID 和对工厂本身的引用。在序列化过程中,工厂 UUID 会被保留。执行反序列化时,对象尝试恢复与其工厂的链接,但它在具有指定 UUID 的会话工厂不存在的其他实例中进行反序列化。因为会话工厂丢失而引发异常。
有没有办法避免这种异常?
Hibernate 和相关库版本如下:
<hibernate.version>5.3.14.Final</hibernate.version>
<hibernate-types-52.version>2.5.0</hibernate-types-52.version>
<hazelcast.version>3.11.5</hazelcast.version>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate53</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types-52.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
小智 5
在您的 Hibernate 配置中,包含以下属性:
<property name="hibernate.session_factory_name">some_sf_name</property>
Run Code Online (Sandbox Code Playgroud)
当使用复合主键时,它会映射到org.hibernate.usertype.UserType具有对 SessionFactory 的引用的主键。这就是为什么另一个实例在找不到正确的 SF 时会引发错误的原因。
来自 Hibernate文档:
hibernate.session_factory_name(例如 JNDI 名称): 用于命名 Hibernate SessionFactory 的设置。只要在每个 JVM 上使用相同的名称,命名 SessionFactory 就可以使其在 JVM 之间正确序列化。
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |