java - 2个表的序列中的相同ID - JPA
问题描述
我有 2 个实体使用与主键相同的序列,我该如何映射?例子:
@Entity
@Table("employeT")
public class Employe(){
@SequenceGenerator(name = "generator_id", sequenceName = "seq_id")
@GeneratedValue(generator = "generator_id")
@colunm(name = "id")
private Integer id;
@colunm(name = "nameEmp")
private String name;
@JoinColumn(name = "id")
private Computer computer;
}
@Entity
@Table("computerT")
public class Computer(){
@SequenceGenerator(name = "generator_id", sequenceName = "seq_id")
@GeneratedValue(generator = "generator_id")
@colunm(name = "id")
private Integer id;
@colunm(name="name_computer")
private String nameComputer;
}
我需要用相同的 id 保存员工和计算机,由 Employe save 生成。
解决方案
您的代码需要做三件事,才能按照您想要的方式工作。
- 添加@OneToOne注释以指示 Employee 和 Computer 是相关的。
- 从您的 Computer 实体中删除有关@SequenceGenerator的信息并添加@Id注释
- 添加@MapsId注释。[更多信息]
所以它看起来像这样:
@Entity
@Table("employeT")
public class Employe(){
@Id
private Integer id;
@Colunm(name = "nameEmp")
private String name;
@OneToOne
@JoinColumn(name = "computer_id")
@MapsId
private Computer computer;
}
为什么?
@OneToOne 注解表示实体之间的关系。
@SequenceGenerator 是多余的,因为我们从计算机实体“复制”了 id。
@Id 注释是强制性的,以表明该字段是我们的主键。
最后但并非最不重要的一点是,@MapsId 注释具有魔力,它从关系中“借用”id。
更多信息在我之前附加的链接中。
推荐阅读
- sql - 根据条件 SQL 排除行
- html - Flutter 中的 Html 文本高亮问题。我可以在颤动中突出显示html文本吗?
- javascript - 从javascript调用php函数不起作用
- python - 从 PyInstaller 打包的 wxPython GUI 应用程序打开默认浏览器
- logging - 气流未将日志写入基本日志文件夹
- javascript - 如何让我的键盘读取按键并将其显示在下面的框中?
- c++ - 在抽象类的具体实现中内部调用装饰函数
- ios - iOS Objective C - 协调器和模型应该从 NSObject 继承吗?
- google-apps-script - 如何根据列标准将工作表中的行附加到 GoogleSheets 中的另一个工作表
- c# - 在 Asp.Net MVC 中为 Authorize 属性存储用户列表的最佳方法是什么?