我想知道在JPA中使用Object作为复合键是否是 GOOD 练习。例如,我有几个复合键,是来自另一个表的外键并与它们映射。
复合类
@Embeddable
public class CashInstrumentComposite implements Serializable {
private static final long serialVersionUID = -6065538857637001219L;
@Column(name = "instrument_id", nullable = false)
private String instrumentId;
@OneToOne
@JoinColumn(name = "company_id")
private Company companyId;
@Column(name = "instrument_type", nullable = true)
@Enumerated(EnumType.STRING)
private InstrumentType instrumentType;
@Column(name = "batch_no", nullable = false)
private String batchNumber;
}
实体类
@Entity
@Table(name = "bank_corporate_cash_instrument")
public class CashInstrument extends Model {
/* serial version id. */
private static final long serialVersionUID = 8360452197690274885L;
/* specify the composite key */
@EmbeddedId
private CashInstrumentComposite compositeId;
我可以毫无问题地坚持使用它,但我读过这个,
http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html#bnbqf
它说主键应该是
之一那我在这里做错了什么?请解释。谢谢你
答案 0 :(得分:1)
我认为你没有解释那篇文章说的正确:
主键或复合主键的属性或字段必须是以下Java语言类型之一:
答案 1 :(得分:0)
来自javadoc的@EmbeddedId
应用于实体类或映射超类的持久字段或属性,以表示作为可嵌入类的复合主键。可嵌入类必须注释为Embeddable。 例如:
@EmbeddedId
protected EmployeePK empPK;
和EmployeeKey:
@Embeddable
public class EmployeePK {
private Long key1;
private Long key2;
}
您可以查看:
答案 2 :(得分:0)
好的,我做了一些示例应用程序,我看起来可以将对象用作复合键。但我仍然对本文档中的内容感到困惑
http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html#bnbqf
但是使用复合键并不是一个好习惯,因为当你使用复合键中的一个键作为外键时,你也必须复制该复合键中的其余键。如果您将4-5个键作为复合键,这将是一种浪费。