Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 使用复合键连接两个表_Jakarta Ee_Jpa_Jpa 2.0 - Fatal编程技术网

Jakarta ee 使用复合键连接两个表

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实体? 我认

我将手放在一个非常古老的基于DB的遗留应用程序(即MySQL)上,该应用程序有两个表用于映射发票:让我们称它们为INVOICE_HEADER和INVOICE_ROWS

好吧,理想的场景显然是一个长Id的
@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类来实现