为了账号安全,请及时绑定邮箱和手机立即绑定

SpringBoot“不是实体”

SpringBoot“不是实体”

茅侃侃 2021-11-17 10:51:43
我是 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: Not an entity: class my.package.IndexSetup顺便说一句,没有构建错误,并且在模块成为父 pom 项目的一部分之前,它们与子文件夹中的服务器类位于同一个项目中,并且可以正常工作。为了方便开发,我决定将它们分开,并在生产中提供两个独立的模块。那么为什么当所有内容都在同一个 Netbeans 项目下并且现在模块位于 2 个不同的子文件夹中(但在同一个组 ID 包“my.package”中)时它会起作用,我得到这个“不是实体”,我该怎么办要解决这个问题,我应该在哪里看?请注意:我已经尝试过但没有成功(“空指针异常,无法加载数据库”)。
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

我认为您应该在第二个项目/模块中添加到您的实体的 @EntityScan 注释包中


查看完整回答
反对 回复 2021-11-17
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

首先,一些检查:

  • 您的所有配置是否仅使用 ServerApplication 或任何 Java 类中的注释构建,或者在 XML/YML 文件中是否还有其他外部配置?也许寻找冲突。如果可能,我们不希望将 XML 与注释配置混合使用。

  • 尝试删除@Serializable(不是强制性的)。

  • 尝试在您的根包中移动您的实体(作为测试)。

  • 检查导出的包@Entity是否正确。

问题:你所说的“模块”是什么,它是一个子包或 Maven 模块还是其他东西?我们可以有关于这个的包名的配置吗?

编辑

  • 对于多模块项目,您是否遵循了spring.io关于多模块项目的建议?您是否在子模块中导入了 Spring BOM(或启动器)并测试了Spring Boot Maven 插件

  • 你能提供你的application.properties(或application.yml其他)你的数据源配置吗?您应该检查您的数据源(和 JPA、驱动程序类等)是否正确定义;见spring.io


查看完整回答
反对 回复 2021-11-17
?
慕的地10843

TA贡献1785条经验 获得超8个赞

    所以碰巧我没有正确使用 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 中删除并将其放入索引模块的资源中。我这样做是因为 SpringBoot 有自己的配置机制。我还从 Base 中删除了 LocalDatabase 类(因为 SpringBoot 不需要它)并将它也放到索引模块中(确实在那里使用了它)。


2) 按照 [this]( https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html]我添加spring-boot-starter-data-jpa到服务器模块 pom.xml。


3)按照本教程,我创建了一个IndexSetupRepository几乎没有一行代码的 JPA 存储库:


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(请参阅转换为 _ 的驼峰案例),我不得不将此行添加到 application.properties :


spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

6) 现在,当我得到“Entity not managed”时,我最终@EntityScan按照你们许多人的建议向 Server 主类添加了注释。


@EntityScan("my.package.Entities")

请注意,@EntityScan应该指向包含实体类的文件夹而不是实体类本身,即@EntityScan("my.package.Entities.IndexSetup")不起作用。


查看完整回答
反对 回复 2021-11-17
  • 3 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信