Hibernate 4.3.6 + Glassfish 4.1 + JPA 2.1

Я пытаюсь перейти с EclipseLink на Hibernate в своем приложении Java EE 7 и столкнулся с некоторыми проблемами, которые не могу понять.

Вот моя среда:

  • Стеклянная рыба 4.1
  • Спящий режим 4.3.6
  • Java 1.8.0_20

Я также использую:

  • EE 7
  • КДИ
  • JPA 2.1

В конечном счете, наша цель — иметь возможность использовать Java 8 Streams и Lambdas, поскольку в нашем приложении много манипуляций с наборами, а EclipseLink в настоящее время не поддерживает Streams. У нас есть еще один проект, работающий с Hibernate (на Wildfly), который делает это, но мы надеялись, что сможем просто перейти на Hibernate вместо замены всего стека Java EE App Server.

До сих пор я делал следующее, но в основном следовал приведенным здесь инструкциям: https://coderwall.com/p/e5fxrw

  1. Я установил необходимые JAR-файлы Hibernate и менеджер сущностей в свой каталог /glassfish/lib.

  2. Я изменил свой блок сохранения в файле persistence.xml следующим образом:

    <persistence-unit name="mypu" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/myds</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.SunOneJtaPlatform" />
    <property name="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory"/>
    <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
    </persistence-unit>
    

Теперь первое исключение, которое я получаю, это "java.lang.IllegalArgumentException: Not a entity:..." Однако все мои классы аннотированы с помощью @Entity и работали в EclipseLink. Я не думаю, что мне нужно перечислять свои классы с exclude-unlisted-classes = false, и я действительно хотел бы этого избежать.

изменить: по предложению unwichtich я попытался добавить:

    <property name="hibernate.archive.autodetection" value="class, hbm"/>

и индивидуальное указание классов в PU в файле persistence.xml без каких-либо улучшений.

Спасибо за любую помощь.


person Jim    schedule 30.10.2014    source источник
comment
Вы упаковываете как WAR или как EAR?   -  person unwichtich    schedule 30.10.2014
comment
ВОЙНА - однако сейчас это взрывная ВОЙНА во время разработки.   -  person Jim    schedule 31.10.2014
comment
Продвинулись ли вы дальше, добавив Hibernate в GlassFish 4?   -  person peter_pilgrim    schedule 25.02.2015
comment
@peter_pilgrim на данный момент мы представили его и все еще находимся на EclipseLink. Мы планируем просто перейти на WildFly, чтобы улучшить поддержку Java 8.   -  person Jim    schedule 14.03.2015


Ответы (2)


Проблема кажется ошибкой в ​​​​версии Hibernate 4.3.6+. У меня была та же проблема, и (после целого дня поломки головы) я попытался изменить версию Hibernate (использовал 4.3.7). После некоторого тестирования я заметил, что версия 4.3.5 работает плавно. Так же, как вы представили, с использованием EclipseLink также не было никаких проблем.

Я попытался проанализировать исходный код Hibernate, но не смог найти проблему. В любом случае, даже если это не постоянное решение, может быть обходной путь. В моем случае я изменил проект, чтобы использовать Hibernate 4.3.5.

Я надеюсь, вам понравится.

person Marcelo Barros    schedule 28.11.2014

Вы правы, это должно работать с вашей настройкой.

Однако может случиться так, что Hibernate каким-то образом не сможет обнаружить ваши сущности.

Вы можете явно включить автоматическое обнаружение объектов для Hibernate с помощью этого свойства в persistence.xml:

<property name="hibernate.archive.autodetection" value="class, hbm"/>

Это также должно быть значением по умолчанию, даже если вы его не объявляете.

Если ваши классы сущностей находятся в отдельном файле jar, вы должны объявить его следующим образом:

<property name="hibernate.archive.autodetection" value="class, hbm, jar"/>

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

<class>com.model.Entity</class>

Не забудьте очистить и собрать свой проект перед его повторным развертыванием.

См. также:

person unwichtich    schedule 30.10.2014
comment
Пробовал все это, включая объявление классов. Не повезло, однако теперь я вижу 2 разных исключения: 1) IllegalArugmentException, которое у меня было раньше, и 2) немного другой вариант java.lang.IllegalStateException: EntityManagerFactory закрыт. Я начинаю задаваться вопросом, есть ли ошибка/несовместимость между GF 4.1 и Hibernate 4.3.6. - person Jim; 31.10.2014
comment
Также я должен отметить, что я получаю ошибку № 1 при запуске сервера и развертывании и ошибку № 2 при попытке повторного развертывания. - person Jim; 31.10.2014
comment
Кроме того, я не упомянул .. Я также использую CDI, который также может быть рывком в этом. - person Jim; 31.10.2014