【问题标题】:Reference to unknown entity: java.lang.Integer引用未知实体:java.lang.Integer
【发布时间】:2019-04-21 14:55:22
【问题描述】:

我正在上简单的@Entity 课程

@Entity
@Table(name = "user")
@Getter       
class User {
    @Id
    @GeneratedValue
    private final Integer userID;    
    private final String username;   
}

还有一个,应该持有外键

@Getter
@Builder
@Entity
class Task {
    @Id
    @GeneratedValue
    private final Integer taskID;

    private final String title;
    private final String details;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinTable(name = "user", joinColumns = {@JoinColumn(name = "userID")})
    private final Integer userID;
}

重点是 - UserTask 类位于单独的包中,并且都属于包范围。意味着我不能简单地写

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinTable(name = "user", joinColumns = {@JoinColumn(name = "userID")})
private final User user;

这就是我得到的原因

@OneToOne or @ManyToOne on com.johndoe.teamplanner.task.domain.Task.userID references an unknown entity: java.lang.Integer

是否有解决方法来实现我的需要?在单独的包中并具有包范围的 2 个实体之间创建关系?

【问题讨论】:

  • 整数不是实体。只有实体可以用 ManyToOne 注释。
  • 嗯,你读过我的问题吗?我知道这一点,我正在寻找解决方法。我要在这里引用的实体是另一个包,并且具有包范围。
  • 按照设计,您阻止自己能够从任务中引用用户。所以你不能再使用关联了。解决方法是不使用 ManyToOne。将所有列视为简单值,因此不要使用 ManyToOne 注释它们。这将使您的生活变得比必要的复杂得多,但这是您的选择。 (如果您知道这一点,为什么要使用 ManyToOne 注释 Integer?)
  • 我尝试过六边形架构,我将应用程序分成更小的包,TaskUser 只是一个示例,我可以将它们放在一个范围内,但这意味着我的整个应用程序将在一个范围内,因为我有许多关系的模型。我试过Integer 只使用相关的班级ID,而不是整个班级,但我想这也不会那么容易。
  • 我对六边形架构一无所知。推广孤岛的架构提供了一些优势,但也是主要的痛点。如果所有实体都是共享唯一数据库的唯一应用程序的一部分,那么痛点可能比优点更重要,尤其是在使用 JPA 时。如果您正在设计独立的微服务,每个微服务都有自己的数据库和开发周期,那么解耦会更有意义。

标签: java spring spring-data


【解决方案1】:

您可以尝试以下替代方案:

  • 显而易见的一个:将类User的访问器更改为public。但是,如果您问这个可能是因为您没有源代码,无法更改它。
  • 反编译User .class 文件以获得源代码。如果用户不是那么复杂,你可能可以试试这个。然后,将访问者更改为public
  • 生成您自己的 User 类版本,并将您的用于持久性,另一个用于它提供的功能。
  • userID 映射为Task 类中的整数,并通过代码确保您永远不会分配不是有效用户ID 的值:@Column private Integer userID;。如果您使用 JPA 生成表,则需要在数据库中手动添加外键以确保数据的完整性。

我希望其中一些解决方案能有所帮助。

【讨论】:

  • 一个问题 - 最后一点将如何反映在数据库中?通过使用@ManyToOne 等,我在此列上获得了外键,对吗?如果我不使用它,我的数据库将只是一组未连接的表?
  • @Weeedooo JPA 不应该是创建数据库模式的工具。对于简单的一次性演示应用程序,它可以做到这一点,但对于真实的事情,您应该创建模式,记录它,添加必要的约束和索引,将数据从模式的一个版本迁移到另一个版本,等等。使用设计的工具这样做,例如 FlywayDB。
  • @Weeedooo,我刚刚编辑了帖子以回复您的评论。
猜你喜欢
  • 2014-04-16
  • 2020-01-17
  • 2015-03-27
  • 1970-01-01
  • 2016-03-08
  • 2011-01-26
  • 2017-07-15
  • 2021-12-22
相关资源
最近更新 更多