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 ) |
在第一个实例上对该数据库执行此实体的更新时,在第二个实例上引发异常
在调试之后,我找到了导致此异常的原因-在反序列化期间,它由
根据我的发现。
引起问题的对象是"会话作用域"。换句话说,它绑定到特定的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> |
使用复合主键时,将其映射到
从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.