3

我有一个带有以下persistence.xml文件的多个实体的 JavaEE 项目:

...
<properties>
    <!-- Scan for annotated classes -->
    <property name="hibernate.archive.autodetection" value="class"/>
...

它似乎有效。然后将该项目作为 JAR 部署到两个不同的项目。其中一个persistence.xml文件与上面的文件基本相同,即使用了autodetectionHibernate的特性。但是,它似乎不起作用(因为我认为它需要加载搜索 jar 中的实体)。当我尝试手动列出两个 xml 文件中的所有实体时,一切正常。

编辑:它适用于jar 文件,但仅适用于 jar 的绝对路径。对于团队项目来说非常无用。

4

3 回答 3

3

如果我没看错的话,在它不起作用的情况下,实体与所使用的 persistence.xml 位于不同的 JAR 中,对吧?

我认为你是对的,这就是问题所在。您需要使用jar-file元素告诉 Hibernate 要扫描哪些 JAR。在此处查看Hibernate 文档中的解释和示例

于 2013-08-02T09:14:11.210 回答
2

我认为 Hibernate 仅扫描 jar 文件中的 JPA 实体,而不是例如类/文件夹中的 JPA 实体,或者它仅使用 persistence.xml 或类似的东西扫描 jar。与其试图弯曲 Hibernate 扫描仪,我觉得自己扫描实体会更容易。这比我预期的要容易得多。

 val entities = mutableListOf<Class<*>>()
AnnotationDetector(object : AnnotationDetector.TypeReporter {
    override fun reportTypeAnnotation(annotation: Class<out Annotation>?, className: String?) {
        entities.add(Class.forName(className))
    }

    override fun annotations(): Array<out Class<out Annotation>> = arrayOf(Entity::class.java)
}).detect("com.github")

VaadinOnKotlin.entityManagerFactory = Persistence.createEntityManagerFactory("sample", mapOf(AvailableSettings.LOADED_CLASSES to entities))

我使用了大气jar文件中内置的检测器;但是您可能可以使用https://github.com/rmuller/infomas-asl或此处所述的其他内容:在运行时扫描 Java 注释 完整的代码示例位于此处:https ://github.com/mvysny/vaadin-on -kotlin/blob/master/vok-example-crud/src/test/java/com/github/vok/example/crud/Server.kt

以下都没有帮助:添加

<exclude-unlisted-classes>false</exclude-unlisted-classes>

persistence.xml文件什么也没做(根据文档,它在 JavaSE 中被忽略了);添加

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

persistence.xml文件什么也没做(反正我没有使用 hbm)。不要浪费时间尝试添加它们,它们不会启用正确的自动扫描。

于 2017-01-25T07:29:22.437 回答
0

使用空元素<jar-file></jar-file>适用于例如 WildFly 8.2.1.Final (Hibernate 4.3.7.Final) :) 如此所述。(<property name="hibernate.archive.autodetection" value="class, hbm" />没有工作)

(但它在 WildFly 之外无法用于 Eclipse 运行的 JUnit 测试,我们必须将其删除。这不是问题,因为库已经在类路径中。错误类似于java.net.URISyntaxException: Expected scheme-specific part at index 5: file:> => <java.lang.IllegalArgumentException: Unable to visit JAR file:. Cause: Expected scheme-specific part at index 5: file:> => <javax.persistence.PersistenceException: Unable to build entity manager factory:)

于 2017-07-05T11:53:59.553 回答