есть много вопросов по этому поводу в интернете ... однако я все еще борюсь с тем, что кажется довольно типичным сценарием.
Я делаю довольно простой проект 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 Тем не менее, я изо всех сил пытаюсь поверить, что такая проблема варианта использования основного потока может иметь такой незначительный грязный взлом решения :(