休眠 - Hazelcast。第二关cache.Could 找不到SessionFactory异常

Hibernate - Hazelcast. Second level cache.Could not find a SessionFactory exception

图例:

在应用程序中存在具有下 class 级注释的实体:

@Entity
@Cache( usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE )
@Table( name = "entity", catalog = "main" )
@IdClass( EntityPK.class )

在第一个实例上对该实体执行数据库更新时,在第二个实例上抛出异常 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 方法抛出。此 class 的实例是默认 Hibernate 缓存键对象的一部分。

据我了解。 导致问题的对象是 "session scoped"。换句话说,它绑定到特定的 SessionFactory 并在其字段中包含会话工厂 UUID 和对工厂本身的引用。在序列化期间,工厂 UUID 被保留。执行反序列化时,对象尝试将 link 恢复到其工厂,但它在其他实例中反序列化,其中不存在具有指定 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>

在您的 Hibernate 配置中,包括以下内容 属性:

<property name="hibernate.session_factory_name">some_sf_name</property>

当使用复合主键时,它被映射到 org.hibernate.usertype.UserType,后者引用了 SessionFactory。这就是为什么另一个实例在找不到合适的 SF 时引发错误的原因。

来自休眠 doc:

hibernate.session_factory_name (e.g. A JNDI name): Setting used to name the Hibernate SessionFactory. Naming the SessionFactory allows for it to be properly serialized across JVMs as long as the same name is used on each JVM.