Неизвестный объект с Hibernate обновлен до 5.2.3 и выше

Как только я перейду на Hibernate 5.2.3 или выше, Gradle больше не сможет найти мои классы сущностей:

Caused by: java.lang.IllegalArgumentException: Unknown entity: data.model.User
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:768)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:744)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:749)
    at core.data.model.service.PersistenceService.lambda$create$0(PersistenceService.java:105)
    at core.data.model.service.PersistenceService.withTransaction(PersistenceService.java:156)

Это не происходит с Hibernate 5.2.2 и ниже.

Это не исправило: что Gradle отсутствует, чтобы отобразить hibernate?.

Это мой класс пользователя:

@Entity
@XmlRootElement
@Table(name = "user")
public class User extends EntityBase {
    // some attributes
}

и мой класс EntityBase:

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.NONE)
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class EntityBase {
    /**
     * The entity UUID.
     */
    @Id
    @XmlAttribute
    private String uuid;

    public EntityBase() {
        uuid = UUID.randomUUID().toString();
    }
}

У тестов есть свой собственный persistence.xml, он выглядит так:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="PersistenceUnit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <class>data.model.User</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.connection.url" value="jdbc:h2:mem:exerciseHandlerTest;DB_CLOSE_DELAY=-1"/>

            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>

            <property name="hibernate.transaction.jta.platform"
                      value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>

            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Я также получаю это исключение при запуске тестов:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Difficulty is not mapped [select count(difficulty)
from Difficulty difficulty]

Это странно, потому что это происходит только при прохождении через Gradle, без него все в порядке.

Обновление 1

По-видимому, проблема вообще не связана с Gradle, потому что я просто понял, что получаю эти Исключения при запуске тестов в IntellIJ:

java.lang.ExceptionInInitializerError
    at core.test.BaseTest.<init>(NablaTest.java:55)
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    ...
Caused by: org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [java:comp/env/jdbc/foobar]
    ... 37 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    ... 47 more

Это заставляет меня понять, что проблема заключается в том, что Так как Hibernate 5.2.3 с использованием второго persistence.xml, просто для тестов единиц не работает

Итак, у меня есть src/main/resources/META-INF/persistence.xml и src/test/resources/META-INF/persistence.xml, но он продолжает читать persistence.xml из src/main/... начиная с версии 5.2.3: (

Обновление 2

Хорошо, я знаю, как воспроизвести проблему, я просто не знаю, почему это происходит или как это исправить.

У меня есть многомодульная настройка с использованием последней версии Gradle. У меня есть основной модуль с build.gradle, который содержит зависимость от спящего режима:

compile "org.hibernate:hibernate-core:5.2.3.Final"

И тогда там мой модуль, где сбой модулярных тестов:

dependencies {
    // core functionalities
    compile project(":core")
    testCompile project(":core")

    testCompile project(":core").sourceSets.test.output
}

Если я прокомментирую последнюю строку ( "проект testCompile (": core "). sourceSets.test.output" ), он работает нормально.

Почему это?

Ответ 1

попробуйте загрузить в Hibernate 5.2.9.Final, например, используя maven и следуя этому примеру:

@Entity
public class Customer {

    @Id
    private Integer id;

    private String name;

    @Basic( fetch = FetchType.LAZY )
    private UUID accountsPayableXrefId;

    @Lob
    @Basic( fetch = FetchType.LAZY )
    @LazyGroup( "lobs" )
    private Blob image;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public UUID getAccountsPayableXrefId() {
        return accountsPayableXrefId;
    }

    public void setAccountsPayableXrefId(UUID accountsPayableXrefId) {
        this.accountsPayableXrefId = accountsPayableXrefId;
    }

    public Blob getImage() {
        return image;
    }

    public void setImage(Blob image) {
        this.image = image;
    }
}

Ответ 2

Я столкнулся с тем же типом ситуации, но не с той же ошибкой. Ресурсы тестирования (класс, файлы conf и т.д.) Не должны храниться в тестовой части core, а в автономном проекте.

Мое решение:

  • Создайте отдельный проект core-test
  • Вставьте в него (в src/main) код многократного использования, сохраненный в src/test части core
  • В ваших модулях замените testCompile project(":core").sourceSets.test.output на testCompile project(":core-test")

Он должен решить вашу проблему.