Java 从jar自动检测Hibernate中的类

Java 从jar自动检测Hibernate中的类,java,hibernate,jakarta-ee,jboss,Java,Hibernate,Jakarta Ee,Jboss,我有一个JavaEE项目,其中有几个实体,具有以下persistence.xml文件: ... <properties> <!-- Scan for annotated classes --> <property name="hibernate.archive.autodetection" value="class"/> ... 。。。 ... 这似乎奏效了。然后将该项目作为JAR部署到两个不同的项目中。其中一个文件中的persistenc

我有一个JavaEE项目,其中有几个实体,具有以下
persistence.xml
文件:

...
<properties>
    <!-- Scan for annotated classes -->
    <property name="hibernate.archive.autodetection" value="class"/>
...
。。。
...
这似乎奏效了。然后将该项目作为JAR部署到两个不同的项目中。其中一个文件中的
persistence.xml
文件与上面的文件基本相同,即使用Hibernate的
autodetection
功能。但是,它似乎不起作用(因为我认为它需要在jar中加载对实体的搜索)。当我尝试手动列出这两个xml文件中的所有实体时,一切正常


编辑:它与jar文件一起工作,但只与jar的绝对路径一起工作。对于团队项目来说非常无用。

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

我想你是对的,这就是问题所在。您需要使用JAR file元素告诉Hibernate要扫描哪些JAR。
参见Hibernate文档中的解释和示例

我认为Hibernate只扫描jar文件中的JPA实体,而不是类/文件夹中的JPA实体,或者它只扫描jar中的persistence.xml之类的内容。我觉得自己扫描实体会更容易,而不是试图弯曲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))

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

使用空元素
可以工作,例如使用WildFly 8.2.1.Final(Hibernate 4.3.7.Final):)如上所述。 (
不起作用)


(但它在WildFly for Eclipse运行JUnit测试之外不起作用,我们必须将其删除。这不是问题,因为库已经在类路径中。错误类似于:
java.net.URISyntaxException:index 5处的预期方案特定部分:file:>=>=>但是jar文件的正确路径是什么?所有我都知道尝试导致一个
系统找不到指定的路径
?此stackoverflow问题可能会有所帮助:。编辑Oops,我刚刚看到您的编辑-我想您已经理解了。抱歉,是的,我在阅读有关绝对路径要求的文章时也这么认为。
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<property name="hibernate.archive.autodetection" value="class, hbm" />