使用注释的Hibernate中的复合主键

时间:2010-05-21 17:07:34

标签: java sql oracle hibernate ora-01400

我有一个表,它使用两列来表示其主键,一个事务ID,然后是序列号。

我尝试了2.2.3.2.2节中推荐的http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping,但是当我使用Hibernate会话提交此Entity对象时,它在insert语句中省略了TXN_ID字段,并且只包含BA_SEQ字段!

出了什么问题?这是相关的代码摘录:

@Id 
@Column(name="TXN_ID")
private long txn_id; public long getTxnId(){return txn_id;} public void setTxnId(long t){this.txn_id=t;}

@Id
@Column(name="BA_SEQ")
private int seq; public int getSeq(){return seq;} public void setSeq(int s){this.seq=s;}



以下是一些日志声明,用于说明失败的确切原因:

In createKeepTxnId of DAO base class: about to commit Transaction :: txn_id->90625 
seq->0 ...<Snip>...

Hibernate: insert into TBL (BA_ACCT_TXN_ID, BA_AUTH_SRVC_TXN_ID, BILL_SRVC_ID, 
BA_BILL_SRVC_TXN_ID, BA_CAUSE_TXN_ID, BA_CHANNEL, CUSTOMER_ID, BA_MERCHANT_FREETEXT, 
MERCHANT_ID, MERCHANT_PARENT_ID, MERCHANT_ROOT_ID, BA_MERCHANT_TXN_ID, BA_PRICE, 
BA_PRICE_CRNCY, BA_PROP_REQS, BA_PROP_VALS, BA_REFERENCE, RESERVED_1, RESERVED_2,
RESERVED_3, SRVC_PROD_ID, BA_STATUS, BA_TAX_NAME, BA_TAX_RATE, BA_TIMESTAMP, BA_SEQ) 
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[WARN] util.JDBCExceptionReporter SQL Error: 1400, SQLState: 23000
[ERROR] util.JDBCExceptionReporter ORA-01400: cannot insert NULL into 
("SCHEMA"."TBL"."TXN_ID")

需要注意的重要一点是我打印出具有txn_id集的实体对象,然后下面的insert into语句在列表中不包含TXN_ID,因此NOT NULL表约束拒绝查询。

2 个答案:

答案 0 :(得分:4)

how to make a composite primary key (java persistence annotation)

这有帮助。

@IdClass(TxnPK.class)

然后在我的Entity类中定义一个Serializable实现类TxnPK,其中包含我想要的字段,以及equals和hashCode方法。

主键的“辅助”字段上的注释。所以@Id在BA_SEQ字段上。还实现了hashCode并等于补充。

答案 1 :(得分:1)

使用@EmbeddedId@Embeddable。大致是:

@EmbeddedId
private CompositeKey key;


@Embeddable
public class CompositeKey {
    @Column
    private int something;

    @Column
    private int somethingElse;
}