我是Hibernate和SpringBoot的新手。我的项目涉及一个搜索引擎,该引擎由2个独立模块+ 1个共同的基本模块(IndexSetup类所在的地方)组成。
IndexSetup
有一个用于索引的模块(JavaFx),另一个用于通过Web浏览器进行搜索(Spring Boot)。
索引模块涉及一个“ IndexSetup”类,该类具有有关如何/应如何编制索引的详细信息:
@Entity @Table(name = "IndexSetups") @Access(AccessType.PROPERTY) public class IndexSetup { private final SimpleIntegerProperty id = new SimpleIntegerProperty(); @Id @GeneratedValue(strategy = GenerationType.AUTO) // For H2 AUTO is required to auto increment the id public int getId() { return id.get(); } //... other properties, getters and setters }
因此它很好用,可以对数据建立索引,并且可以通过索引模块内的搜索方法进行检索。
但是,当我运行Spring Boot服务器并执行相同的搜索时,我得到java.lang.IllegalArgumentException:不是实体:类my.package.IndexSetup
顺便说一句,没有构建错误,并且在模块成为父pom项目的一部分之前,它们与服务器类位于子文件夹中并且位于同一项目中,并且可以正常工作。为了方便开发,我决定将它们分开,并在生产中提供两个独立的模块。
那么,当所有内容都在同一个Netbeans项目下并且这些模块位于2个不同的子文件夹中(但在同一组id包“ my.package”中)时,为什么它起作用了,我得到了“ Not aentent”,我该怎么办为了解决这个问题,我应该在哪里看?
编辑1: 我也尝试添加@EntityScan下面这个,但我仍然得到Not an entity: class my.package.IndexSetup:
@EntityScan
Not an entity: class my.package.IndexSetup
@SpringBootApplication @EntityScan( basePackages = {"my.package"} ) public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
编辑2: 项目的架构如下:
- Parent project (my.package) -Module Base (with IndexSetup class) -Module Indexing (that depends on Base) -Module Server (that also depends on Base)
父pom.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.package</groupId> <artifactId>MyApp</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!--According to https://stackoverflow.com/questions/10665936/maven-how-to-build-multiple-independent-maven-projects-from-one-project--> <modules> <module>Base</module> <!-- Common resources which is a dependency in Indexer and Server --> <module>Indexer</module> <!-- Indexing part with JavaFx--> <module>Server</module> <!-- Server (spring boot) part of --> </modules> <name>MyApp</name> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArguments> <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath> </compilerArguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.16</version> <configuration> <additionalClasspathElements> <additionalClasspathElement>${java.home}/lib/jfxrt.jar</additionalClasspathElement> </additionalClasspathElements> </configuration> </plugin> </plugins> </build>
编辑3: 问题出在指定要查看的表时:
Root<IndexSetup> from = criteriaQuery.from(IndexSetup.class);
每当进入hibernate状态 not an entity时,都会抛出异常entityType == null。 所以我不收集为什么实体类型在这里为null而在SpringBoot之外可以工作呢?
not an entity
entityType == null
编辑4: 如果我SpringApplication.run(ServerApplication.class, args);从Server类的main方法中删除,则导致问题的同一调用即:
SpringApplication.run(ServerApplication.class, args);
LocalDatabase.getInstance(false) // no GUI .getAllIndexSetups();
现在可以使用picobello。当然,它不能解决任何问题,因为我仍然需要SpringBoot进行搜索!因此对我而言,这意味着Spring Boot不了解hibernate配置。我打开了一个新问题,以更准确地介绍这个问题。
任何帮助表示赞赏,
碰巧我没有正确使用SpringBoot功能。这是我遵循的步骤。请记住项目的架构:
- Parent maven project (my.package) |-Module Base (with IndexSetup class and [initialy] hibernate.cfg.xml in /resources. It also had in the beginning LocalDatabase class to access to the local db via hibernate) |-Module Indexing (that depends on Base) |-Module Server (that also depends on Base) |-Database file (myLocalDB)
1)首先,我hibernate.cfg.xml从Base中删除了它,并将其放入了Indexing模块的资源中。我这样做是因为SpringBoot具有自己的配置机制。我还从Base中删除了LocalDatabase类(因为SpringBoot不需要它),并将其也删除了在Indexing Module中(确实使用了它)。
hibernate.cfg.xml
2)在[this]([https://docs.spring.io/spring- boot/docs/current/reference/html/boot-features- sql.html]之后,](https://docs.spring.io/spring- boot/docs/current/reference/html/boot-features-sql.html])我添加spring-boot- starter-data-jpa到服务器模块pom.xml。
spring-boot- starter-data-jpa
3)在学习完本教程之后,我仅用IndexSetupRepository一行代码创建了一个JPA存储库:
IndexSetupRepository
public interface IndexSetupRepository extends CrudRepository<IndexSetup, Integer> {
}
4)在服务器中,application.properties我添加了以下几行:
application.properties
# Embedded database configuration # The embedded database file is one level above the Server folder (ie directly within the parent project) # we use the auto server mode to be able to use the database simultaneously in the indexer and the server spring.datasource.url=jdbc:h2:file:../myLocalDB;AUTO_SERVER=TRUE spring.datasource.username=myName # This parameter helped me discover that SpringBoot was not targetting the right table name. spring.jpa.hibernate.ddl-auto=validate
5)由于SpringBoot告诉我找不到命名的表index_setup(请参阅将驼峰大小写转换为_),我不得不将此行添加到application.properties中:
index_setup
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
6)现在,当我得到“实体不受管理”时,@EntityScan正如许多人建议的那样,我最终在服务器主类中添加了注释。
@EntityScan("my.package.Entities")
请注意,@EntityScan应指向包含实体类而不是实体类本身的文件夹,即该文件夹@EntityScan("my.package.Entities.IndexSetup")不起作用。
@EntityScan("my.package.Entities.IndexSetup")