Регресс Hibernate 5.3 с репликацией ehcache и Composite ID - PullRequest
0 голосов
/ 04 апреля 2019

Мы используем следующие компоненты

org.hibernate:hibernate-core:jar:5.3.7.Final:compile
org.hibernate:hibernate-ehcache:jar:5.3.7.Final:compile
net.sf.ehcache:ehcache:jar:2.10.6:compile
net.sf.ehcache:ehcache-jgroupsreplication:jar:1.7:compile
org.jgroups:jgroups:jar:3.6.6.Final:compile

У нас есть объект с составным идентификатором:

@Entity
@Cache(region = ReplicatedCacheConfiguration.NAME, usage = CacheConcurrencyStrategy.READ_WRITE)
public class SpielErgebnis {
    @EmbeddedId
    protected SpielErgebnisId spielErgebnisId;
  …
}
@Embeddable
public class SpielErgebnisId implements Serializable {
    private static final long serialVersionUID = 1L;
    public Integer spielId;
    public Integer spielabschnittId;
  …
}

Или кеш реплицируется с Jgroups, но отправляет только сообщения о недействительности:

replicateAsynchronously=true
replicatePuts=false
replicateUpdatesViaCopy=false

Когда один из этих объектов изменен и должно быть отправлено сообщение об удалении, принимающая сторона не принимает сообщение и выдает исключение:

Причина:org.hibernate.HibernateException: не удалось найти SessionFactory [uuid = a1d8234c-1c14-4ba5-b429-d026fd2e6197, name = null]

Это происходит после того, как мы обновились с версии hibernate 5.2.17 до 5.3+0,7.Так же бывает и с 5.4.x.

Это полная трассировка стека:

java.lang.IllegalArgumentException: org.hibernate.HibernateException: Не удалось найти SessionFactory [uuid = e440a601-e5d0-4e9d-b4ce45 9410555, name = null] в org.jgroups.Message.getObject (Message.java:383) в org.jgroups.Message.getObject (Message.java:363) в net.sf.ehcache.distribution.jgroups.JGroupsCacheReceiver.receive (JGroupsCacheReceiver.java:64) в org.jgroups.JChannel.invokeCallback (JChannel.java:817) в org.jgroups.JChannel.up (JChannel.java:741) в org.jgroups.stack.ProtocolStack.up (ProtocolStack.java): 1029) в org.jgroups.protocols.pbcast.GMS.up (GMS.java:1045) в org.jgroups.protocols.FRAG.up (FRAG.java:149) в org.jgroups.protocols.pbcast.STABLE.вверх (STABLE.java:234) в org.jgroups.protocols.UNICAST.up (UNICAST.java:402) в org.jgroups.protocols.pbcast.NAKACK.handleMessage (NAKACK.java:790) в org.jgroups.protocols.pbcast.NAKACK.up (NAKACK.java:602) в org.jgroups.protocols.VERIFY_SUSPECT.up (VERIFY_SUSPECT.java:155)в org.jgroups.protocols.FD_SOCK.up (FD_SOCK.java:310) в org.jgroups.protocols.MERGE2.up (MERGE2.java:237) в org.jgroups.protocols.Discovery.up (Discovery.java:295)) в org.jgroups.protocols.TP.passMessageUp (TP.java:1577) в org.jgroups.protocols.TP $ MyHandler.run (TP.java:1796) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) в java.lang.Thread.run (Thread.java:748), вызванный: org.hibernate.HibernateException: не удалось найтиa SessionFactory [uuid = e440a601-e5d0-4e9d-b4ce-94105b545106, name = null] в org.hibernate.type.spi.TypeConfiguration $ Scope.readResolve (TypeConfiguration.java:328) в sun.reflect.AnativeInOМетод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lanke49.j.j.jdjava.io.ObjectStreamClass.invokeReadResolve (ObjectStreamClass.java:1260) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2078) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:15ioStject.jectOject.fid.Fject.Fject.ObFject.Fject.Oject.Fject.Fject.Fject.Fject.Fject.Fject.Fject.Fject.Fject.Fject.Fject.ObFject.jpg в java..java: 2287) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:2211) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) в java.io.ObjectInputStream.readObject0.jj: ObjectInputв java.io.ObjectInputStream.readArray (ObjectInputStream.java:1975) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1567) в java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:io) вObjectInputStream.readSerialData (ObjectInputStream.java:2211) по адресу java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) по адресу java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1573) в точке объекта java.Stream.java:2287) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:2211) вjava.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1573) в java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:2287) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:2211) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1573) в java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:2287) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:2211) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1573) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:431) в java.util.ArrayList.readObject (ArrayList.java:797) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в java.io.ObjectStreamClass.invokeReadObject (ObjectStreamClass.java:1170) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:2178) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:2069) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1573) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:431) в org.jgroups.util.Util.objectFromByteBuffer (Util.java:485) в org.jgroups.Message.getObject (Message.java:380) ... 20 общих кадров опущен * * тысячу двадцать-один

Ошибка выдается в TypeConfiguration , которая доступна с 5.3

1 Ответ

0 голосов
/ 04 апреля 2019

Вы можете исправить эту ошибку, когда дадите имя фабрике сессий. В Spring Boot2 с Tomcat это непросто, так как tomcats jndi не включен по умолчанию.

Включить именование в Tomcat с помощью класса конфигурации Spring:

@Configuration
public class JndiConfig {
    @Bean
    public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
                tomcat.enableNaming();
                return super.getTomcatWebServer(tomcat);
            }
        };
    }
}

Затем добавьте свойство в файл application.properties:

spring.jpa.properties.hibernate.session_factory_name=kicktipp

С именем фабрики сеанса hibernate рад за исключением сообщения и работает как надо.

Дополнительно: если вы все еще получаете ошибку о проблеме отражения, это может быть проблемой загрузчика классов в вашей IDE. Я имел это с Intellij и запустил два экземпляра моего SpringBootApplication:

org.hibernate.property.access.spi.PropertyAccessException: ошибка доступ к полю [публичный java.lang.Integer … SpielErgebnisId.spielId] от отражение для постоянного свойства

Это проблема загрузки классов из-за spring-boot-devtools. Если вы удалите его из пути к классам, репликация будет работать нормально.

...