我是Hibernate和SpringBoot的新手。我的项目处理的搜索引擎由2个独立模块+ 1个两者通用的基本模块(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”中)时它为什么起作用,我得到了这个“不是实体”以及什么我应该怎么做才能解决这个问题,我应该在哪里看?
请注意:我已经尝试了this,但没有成功(“空指针异常,无法加载数据库”)。
修改1:
我还尝试在this之后添加@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);
只要not an entity
就会引发对hibernate sources entityType == null
的查看。 因此,在这里我不收集为什么实体类型为null却在SpringBoot之外可以工作的原因?
编辑4:
如果我从Server类的main方法中删除SpringApplication.run(ServerApplication.class, args);
,则引起问题的同一调用即:
LocalDatabase.getInstance(false) // no GUI
.getAllIndexSetups();
现在可以使用picobello。当然,它不能解决任何问题,因为我仍然需要SpringBoot进行搜索!因此对我而言,这意味着Spring Boot不了解休眠配置。我打开new question可以更准确地介绍问题。
任何帮助表示赞赏,
答案 0 :(得分:1)
我认为您应该在第二个项目/模块中将您的实体添加到@EntityScan注释包中
答案 1 :(得分:1)
首先,进行一些检查:
@Serializable
(并非强制)。 @Entity
的软件包是否正确。问题:您叫什么“模块”,它是子包还是Maven模块或其他东西?我们可以为此配置软件包名称吗?
编辑:
application.properties
(或application.yml
等)提供数据源配置?您应该检查是否正确定义了数据源(以及JPA,驱动程序类...);参见spring.io 答案 2 :(得分:0)
因此,我没有正确使用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)首先,我从Base中删除了hibernate.cfg.xml
,并将其放入了Indexing模块的资源中。我这样做是因为SpringBoot具有自己的配置机制。我还从Base中删除了LocalDatabase类(因为SpringBoot不需要它)并将其也删除了在Indexing Module中(实际上是在其中使用的)。
2)在[this](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html]之后,我向服务器模块pom.xml添加了spring-boot-starter-data-jpa
。
3)在this tutorial之后,我创建了一个JPA存储库IndexSetupRepository
,几乎没有一行代码:
public interface IndexSetupRepository extends CrudRepository<IndexSetup, Integer> {
}
4)在服务器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
的表(请参阅camel case converted to _),我不得不将此行添加到application.properties中:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
6)现在,当我得到“实体不受管理”的信息时,我最终像许多人建议的那样向服务器主类添加了@EntityScan
注释。
@EntityScan("my.package.Entities")
请注意,@EntityScan
应该指向包含实体类而不是实体类本身的文件夹,即@EntityScan("my.package.Entities.IndexSetup")
无效。