Как использовать JPA с провайдером Hibernate для автоматического сканирования классов сущностей - PullRequest
0 голосов
/ 13 сентября 2018

есть много вопросов по этому поводу в интернете ... однако я все еще борюсь с тем, что кажется довольно типичным сценарием.

Я делаю довольно простой проект JPA (использующий Hibernate), в котором классы Entity находятся в пакете com.actions.domain

У меня есть persistence.xml следующим образом:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="my-persistence-unit">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>
            <property name="javax.persistence.jdbc.driver"
                      value="org.h2.Driver" />

            <property name="javax.persistence.jdbc.url"
                      value="jdbc:h2:~/test.h2db" />

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

    </persistence-unit>

</persistence>

этот файл находится в папке src\test\resources\META-INF

У меня также есть тестовые классы JUnit, написанные так:

protected EntityManager entityManager;

@Before
public void setUp() throws Exception {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("my-persistence-unit");
    entityManager = entityManagerFactory.createEntityManager();
}

@Test
public void actionsAdded_success() {
    entityManager.getTransaction().begin();
    entityManager.persist(new Action("TEST_ACTION1", "ACTION"));
    entityManager.persist(new Action("TEST_ACTION2", "ACTION"));
    entityManager.getTransaction().commit();
}

Пример сущности:

@Entity
@Table(name = "UC_ACTIONS")
@Data
public class Action {

    @Id
    @GeneratedValue(generator="increment")
    private Long id;

    private String name;

    private String type;

    public Action(String name, String type) {
        this.name = name;
        this.type = type;
    }
}

Если я добавлю элемент <class>com.actions.domain.Action</class> в описание единицы сохраняемости, все это будет работать как шарм, однако я не хочу перечислять здесь классы вручную, а также не хочу иметь файл hibernate.cfg.xml

Поэтому, если я удаляю этот элемент и пытаюсь каким-либо образом выполнить автоматическое сканирование провайдера для сущностей, я получаю сообщения об ошибках типа Unknown entity: com.actions.domain.Action

Я пытался запустить эти тесты и запустить конфигурацию в IntelliJ, и как команду gradle test. Ни в одном из случаев папка META-INF не находится в том же каталоге, что и classes, так как же люди достигают этого ??

Как на земле можно заставить его работать?

ОБНОВЛЕНИЕ: здесь есть принятый ответ на идентичный вопрос: https://stackoverflow.com/a/16598682/2583044 Тем не менее, я изо всех сил пытаюсь поверить, что такая проблема варианта использования основного потока может иметь такой незначительный грязный взлом решения :(

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Проблема была решена (благодаря Влад Михалчеа ), в конечном итоге, следующим образом:

  1. Перемещена папка META-INF в src/main
  2. Добавлено следующее в build.gradle:

    применить плагин: 'idea'

    idea {module {наследитьOutputDirs = true}}

    sourceSets {main {output.resourcesDir ="build / classes"} test {output.resourcesDir = "build / classes"}}

После этого тесты работают, как ожидается, как из IDEA, так и с Gradle.

0 голосов
/ 13 сентября 2018

По умолчанию автоопределение работает для сущностей в том же элементе classpath, что и persistence.xml. Это может быть настроено элементами.

Чтобы включить правильное автоопределение, когда файл persistence.xml находится в src / test / resources / META-INF, я использую следующий прием:

persistence.xml

<persistence ...>
      <persistence-unit ...>
            <jar-file>${project.build.outputDirectory}</jar-file>
            ...
      </persistence-unit>
  </persistence>

pom.xml - включить фильтрацию ресурсов для src / test / resources:

<project ...>
    ...
    <build>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>
</project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...