在互联网上有很多关于此问题的问题。但是我仍然在为一个看起来很典型的场景而苦苦挣扎。
我正在做一个非常简单的JPA(使用Hibernate)项目,实体类与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尽管如此,我仍在努力相信这样一个主流用例问题可能会有这样一个边缘肮脏的解决方案:(
默认情况下,自动检测适用于与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>
问题得到解决(感谢Vlad Mihalcea)最终如下:
META-INF
下的src/main
文件夹build.gradle
中添加了以下内容:
申请插件:'想法'
idea {module {inheritOutputDirs = true}}
sourceSets {main {output.resourcesDir =“build / classes”} test {output.resourcesDir =“build / classes”}}之后,IDEA和Gradle都在按预期进行测试。