是的,这是可能的,应该不会有任何困难 - ORA JPA是基于设计灵活的解决方案。 JPA使用的ID甚至不必是数据库中使用的PK;唯一的限制是它应该是唯一的。 JPA 2包含对派生ID的支持,这可能有所帮助,因为我认为INVOICE_ROWS的PK是INVOICE_HEADER FK和其他字段的组合。如果它有自己的序列,那么它简化了一下。
您可以选择要使用的选项 - IdClass或将实体中的id类作为EmbeddedId进行缓存。我的偏好通常是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;
}
每个JoinColumn注解的定义外重点领域和它们指向主键字段。 JPA有一个限制,外键必须转到主键字段 - 我相信这是为了允许实体缓存,因为它们被缓存在主键上。如果需要,许多提供商都有解决此限制的方法
如果您的Row实体具有单个主键,则可以使用RowPk类来实现。