我有一个简单的@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 个实体之间创建关系并具有包范围?
您可以尝试以下替代方法:
- 显而易见的是:将类
User
的访问器更改为public
。但是,如果你问这个可能是因为你没有源代码而无法更改它。 - 反编译
User
.class文件以获取源代码。如果用户不是那么复杂,你可以试试这个。然后,将访问器更改为public
。 - 生成您自己的
User
类版本,并将您的版本用于持久性,另一个用于它提供的功能。 - 将类中的
userID
映射Task
为整数,并通过代码确保永远不会分配不是有效 userID 的值:@Column private Integer userID;
。如果使用 JPA 生成表,则需要在数据库中手动添加外键以确保数据的完整性。
我希望其中一些解决方案可以提供帮助。