在JPA中使用对象作为主键和复合键

时间:2014-05-21 12:31:31

标签: java sql jpa primary-key composite-primary-key

我想知道在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

它说主键应该是

之一
  • Java原始类型
  • Java原始包装类型
  • java.lang.String中
  • java.util.Date(临时类型应为DATE)
  • java.sql.Date
  • java.math.BigDecimal中
  • java.math.BigInteger中

那我在这里做错了什么?请解释。谢谢你

3 个答案:

答案 0 :(得分:1)

我认为你没有解释那篇文章说的正确:

  

主键或复合主键的属性或字段必须是以下Java语言类型之一:

答案 1 :(得分:0)

来自javadoc的@EmbeddedId

应用于实体类或映射超类的持久字段或属性,以表示作为可嵌入类的复合主键。可嵌入类必须注释为Embeddable。     例如:

@EmbeddedId
protected EmployeePK empPK;

和EmployeeKey:

@Embeddable
public class EmployeePK {
 private Long key1;
 private Long key2;
}

您可以查看:

Oracle Doc

答案 2 :(得分:0)

好的,我做了一些示例应用程序,我看起来可以将对象用作复合键。但我仍然对本文档中的内容感到困惑

  

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html#bnbqf

但是使用复合键并不是一个好习惯,因为当你使用复合键中的一个键作为外键时,你也必须复制该复合键中的其余键。如果您将4-5个键作为复合键,这将是一种浪费。