1

主キー、トランザクションID、シーケンス番号を表す2つの列を使用するテーブルがあります。

セクション2.2.3.2.2で推奨されているhttp://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mappingを試しましたが、Hibernateセッションを使用してこのエンティティをコミットした場合オブジェクトの場合、挿入ステートメントの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が設定されているエンティティオブジェクトを出力すると、次のステートメントへの挿入にリストにTXN_IDが含まれないため、NOTNULLテーブル制約がクエリを拒否することです。

4

2 に答える 2

4

複合主キーの作成方法(Java永続性アノテーション)

これは役に立ちました。

@IdClass(TxnPK.class)

次に、Entityクラスで必要なフィールドと、equalsメソッドおよびhashCodeメソッドを使用して、Serializable実装クラスTxnPKを定義します。

主キーの「セカンダリ」フィールドの注釈。したがって、BA_SEQフィールドの@Id。また、hashCodeを実装し、補足に等しい。

于 2010-05-21T17:47:26.807 に答える
1

とを使用@EmbeddedId@Embeddableます。だいたい:

@EmbeddedId
private CompositeKey key;


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

    @Column
    private int somethingElse;
}
于 2010-05-21T19:46:17.757 に答える