提问者:小点点

带有Hibernate的JavaFX桌面应用程序-@Entity和其他注释无法识别


所以,我决定用Hibernate和JavaFX做一个项目。我设计了UI,并在我用Maven创建的项目中测试了它,使用的原型叫做“javafx-archetype-fxml”,它工作得很好。现在我试图将Hibernate添加到这个项目中来管理持久层。我在Maven中添加了依赖项,“hibernate-core”v.6.0.0,并继续用“@Entity”类型的注释映射模型类,但是它们不能被VSCode识别。也许我需要添加一个模块来module-info.java?

@实体注释无法识别。

这是我的pom. xml文件:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>6.0.0.Beta1</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>13</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>13</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <mainClass>com.ignaciocassi.App</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

这是我的module-info.java文件:

module com.ignaciocassi {
    requires javafx.controls;
    requires transitive javafx.graphics;
    requires javafx.fxml;
    requires java.sql;
    opens controllers to javafx.fxml;
    exports com.ignaciocassi;
 }

我是Maven和模块化项目的新手,我想学习。任何建议或帮助都将不胜感激。


共3个答案

匿名用户

对于将来和我有同样问题的人,我建议阅读理解Java9个模块——它们是什么以及如何按照@jewelhai的建议使用它们。

对我来说,真正解决这个问题的是将“需要jakarta.持久性”添加到Module-info.java,它提供了JPA注释。

匿名用户

这个答案是从评论中获取一些额外的信息,并添加更多的上下文信息。它是自我回答的补充,已经指出:

对我来说,真正解决这个问题的是将“需要jakarta.持久性”添加到Module-info.java,它提供了JPA注释。

为什么需要jakarta.持久性允许@Entity访问

@Entity注释用于JPA,而不是hibernate(尽管hibernate可以使用它)。Hibernate 6依赖于jakarta 3来提供@Entity定义,它从jakarta.持久性模块中的jakarta.持久性包中获取。

中添加需要jakarta.持久性子句module-info.java文件允许访问该模块导出的类型(包括@Entity类型)。

请注意,如果您使用其他JPA功能(如标准),它们可以在不同的包中,在同一个模块中。因此,即使您使用jakarta.的注释。标准包,只需要jakarta.持久性模块就足够了,因为该模块还包括标准包。

冬眠的其他部分呢

我在网上几乎找不到关于使用Hibernate 6需要在module-info.java中放置什么的具体信息。据我所知,当前的Hibernate 6留档没有提到它(我认为这是留档的一个缺点)。

请注意,Hibernate经常与其他技术一起使用,特别是Spring Data JPA。如果您现在或将来正在考虑在您的应用程序中使用Spring技术(我建议不要使用直接的hibernate集成)。只有当Spring 6和SpringBoot 3发布时,Spring才能真正与JPMS模块系统很好地集成。因此,尽管您可能能够让当前的Spring应用程序与JPMS一起使用,但我建议您以非模块化方式部署您的应用程序(请参阅下面的信息)并运行一些非模块化库,例如类路径之外的任何Spring库(也许还有hibernate-core)。

了解JPMS模块

要帮助理解模块:请参阅了解Java9模块-它们是什么以及如何使用它们,这是Java平台模块系统(JPMS)的基本介绍,如果需要,您可以从那里进行一些独立的研究和学习以获取更多信息。

非模块化JavaFX应用程序

另请注意,您可以避免这些问题,但使您的应用程序是非模块化的(即不要在应用程序中提供module-info.java文件)。核心JDK类和JavaFX本身应该在模块路径之外运行,但您的应用程序和它使用的其他依赖库可以:

  1. 您的应用程序可以是模块化的并在模块路径之外运行
  • 通过在应用程序中包含一个module-info.java文件。
  • 不包含module-info.java文件。

对于非模块化应用程序,您的应用程序类和依赖库可以在类路径而不是模块路径中运行。

有关这方面的详细信息,请参阅openjfx.io入门指南,其中讨论了用于常见IDE设置和创建可部署运行时映像的模块化和非模块化应用程序。

部署非模块化应用程序的缺点是您会失去模块化提供的一些好处(例如更严格的访问控制)。但对于某些应用程序来说,这是一个合适的部署目标。

Maven设置的其他潜在问题

我认为pom的依赖类型是错误的。可能不应该有任何类型。我认为pom类型仅用于在maven项目文件的依赖管理部分导入物料清单。关于pom类型用法的讨论在Baeldung Spring maven bom教程中。我可能错了,pom类型可能还有其他用途,但提供的信息是我目前的理解。

您正在使用betaHibernate软件,这可能没问题,实际上可能与JPMS模块一起工作得更好,但请注意这一点。

hibernate-core仍然可以在org. hibernate中找到,但已将版本6移至org.hibernate.orm,因此未来的版本可能无法在旧组下找到。

匿名用户

尝试添加Spring数据JPA maven依赖项,因为@Entity注释需要javax.持久性包。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.5.5</version>
</dependency>