【发布时间】: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;
}
重点是 - User 和 Task 类位于单独的包中,并且都属于包范围。意味着我不能简单地写
@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?)
-
我尝试过六边形架构,我将应用程序分成更小的包,
Task和User只是一个示例,我可以将它们放在一个范围内,但这意味着我的整个应用程序将在一个范围内,因为我有许多关系的模型。我试过Integer只使用相关的班级ID,而不是整个班级,但我想这也不会那么容易。 -
我对六边形架构一无所知。推广孤岛的架构提供了一些优势,但也是主要的痛点。如果所有实体都是共享唯一数据库的唯一应用程序的一部分,那么痛点可能比优点更重要,尤其是在使用 JPA 时。如果您正在设计独立的微服务,每个微服务都有自己的数据库和开发周期,那么解耦会更有意义。
标签: java spring spring-data