Jakarta ee 使用复合键连接两个表
我将手放在一个非常古老的基于DB的遗留应用程序(即MySQL)上,该应用程序有两个表用于映射发票:让我们称它们为INVOICE_HEADER和INVOICE_ROWS 好吧,理想的场景显然是一个长Id的Jakarta ee 使用复合键连接两个表,jakarta-ee,jpa,jpa-2.0,Jakarta Ee,Jpa,Jpa 2.0,我将手放在一个非常古老的基于DB的遗留应用程序(即MySQL)上,该应用程序有两个表用于映射发票:让我们称它们为INVOICE_HEADER和INVOICE_ROWS 好吧,理想的场景显然是一个长Id的@Id,由发票行表中的FK_头外键映射。映射这种关系的正常JPA方法 但是,该表(标题表)有四列(是的,四列!)作为复合主键(年份、编号、t1、t2)以及行表。应用程序正在使用这四列在两个表之间进行手动连接。 完全没有外键约束 不幸的是,该模式根本无法更改。 我将如何编写我的两个JPA实体? 我认
@Id在发票实体和双向@OnetoMany+@manytone关系中编码>,由发票行表中的FK_头外键映射。映射这种关系的正常JPA方法
但是,该表(标题表)有四列(是的,四列!)作为复合主键(年份、编号、t1、t2)以及行表。应用程序正在使用这四列在两个表之间进行手动连接。
完全没有外键约束
不幸的是,该模式根本无法更改。
我将如何编写我的两个JPA实体?
我认为这就是@IdClass(或@EmbeddedId?)的用例
是否可以使用复合键映射@OneToMany关系?
你能帮我举几个例子吗?谢谢你是的,这是可能的,而且应该一点也不困难-ORMs JPA基于的是灵活的解决方案。JPA使用的ID甚至不必是数据库中使用的pk;唯一的限制是它应该是唯一的。JPA2包括对派生ID的支持,这可能会有所帮助,因为我假设发票行的pk是发票头FKs和其他一些字段的组合。如果它有自己的序列,那么它会稍微简化它
您可以选择要使用-IdClass或将实体中的id类缓存为嵌入id的选项。我的偏好通常是IdClass,因为我不太使用这个类。因此,一个简单的例子是:
@Entity
@IdClass(HeaderPK.class)
class Header {
@Id
java.sql.Date year;
@Id
Integer number;
@Id
String t1;
@Id
String t2;
@OneToMany(mappedby="header")
List<Row> rows;
}
class HeaderPK {
java.sql.Date year;
Integer number;
String t1;
String t2;
}
@Entity
@IdClass(RowPK.class)
class Row {
@Id
String someField;
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name="YEAR", referencedColumnName="YEAR"),
@JoinColumn(name="NUMBER", referencedColumnName="NUMBER"),
@JoinColumn(name="T1", referencedColumnName="T1"),
@JoinColumn(name="T2", referencedColumnName="T2"),
})
Header header;
}
class RowPK {
String someField;
HeaderPK header;
}
@实体
@IdClass(校长级)
类标题{
@身份证
java.sql.Date年份;
@身份证
整数;
@身份证
字符串t1;
@身份证
t2串;
@OneToMany(mappedby=“header”)
列出行;
}
班长{
java.sql.Date年份;
整数;
字符串t1;
t2串;
}
@实体
@IdClass(RowPK.class)
班级排{
@身份证
字符串字段;
@身份证
@许多酮
@连接柱({
@JoinColumn(name=“YEAR”,referencedColumnName=“YEAR”),
@JoinColumn(name=“NUMBER”,referencedColumnName=“NUMBER”),
@JoinColumn(name=“T1”,referencedColumnName=“T1”),
@JoinColumn(name=“T2”,referencedColumnName=“T2”),
})
收割台;
}
RowPK类{
字符串字段;
HeaderPK头;
}
每个JoinColumn注释定义外键字段以及它们指向的主键字段。JPA有一个限制,外键必须转到主键字段——我认为这是为了允许实体缓存,因为它们缓存在主键上。如果需要,许多提供商都有办法绕过这一限制
若您的行实体只有一个主键,那个么可以使用RowPk类来实现