如何让JPA与Hibernate提供程序自动扫描实体类

问题描述 投票:-1回答:2

在互联网上有很多关于此问题的问题。但是我仍然在为一个看起来很典型的场景而苦苦挣扎。

我正在做一个非常简单的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尽管如此,我仍在努力相信这样一个主流用例问题可能会有这样一个边缘肮脏的解决方案:(

hibernate jpa gradle intellij-idea junit
2个回答
0
投票

默认情况下,自动检测适用于与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>

0
投票

问题得到解决(感谢Vlad Mihalcea)最终如下:

  1. 移动了META-INF下的src/main文件夹
  2. build.gradle中添加了以下内容: 申请插件:'想法' idea {module {inheritOutputDirs = true}} sourceSets {main {output.resourcesDir =“build / classes”} test {output.resourcesDir =“build / classes”}}

之后,IDEA和Gradle都在按预期进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.