关于hibernate:hibernate-Hazelcast。二级缓存。找不到SessionFactory异常

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

图例:

  • 每个都有2个带有Hazelcast的应用程序实例。
  • 在群集中配置的Hazelcast实例。正确配置配置,执行同步(在手动模式下测试)。
  • Hibernate使用Hazelcast作为二级缓存提供程序。

在应用程序中,存在具有下一类级别注释的实体:

1
2
3
4
@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方法抛出。此类的实例是默认的Hibernate缓存键对象的一部分。

根据我的发现。
引起问题的对象是"会话作用域"。换句话说,它绑定到特定的SessionFactory,并在其字段中包含会话工厂UUID和对工厂本身的引用。在序列化期间,将保留工厂UUID。执行反序列化时,对象尝试恢复到其工厂的链接,但在不存在具有指定UUID的会话工厂的其他情况下,它将反序列化。由于缺少会话工厂,因此引发异常。

有办法避免这种异常吗?

下一个hibernate和相关的lib版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<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>
    hazelcast-hibernate53</artifactId>
    <version>1.3.2</version>
</dependency>
        <dependency>
        <groupId>org.hibernate</groupId>
        hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        hibernate-jpamodelgen</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        hibernate-envers</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>com.vladmihalcea</groupId>
        hibernate-types-52</artifactId>
        <version>${hibernate-types-52.version}</version>
    </dependency>

在Hibernate配置中,包括以下属性:

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

使用复合主键时,将其映射到org.hibernate.usertype.UserType,该参考具有对SessionFactory的引用。这就是为什么另一个实例在找不到合适的SF时会引发错误的原因。

从Hibernate文档中:

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.