所以,我决定用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和模块化项目的新手,我想学习。任何建议或帮助都将不胜感激。
对于将来和我有同样问题的人,我建议阅读理解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本身应该在模块路径之外运行,但您的应用程序和它使用的其他依赖库可以:
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>