2010-05-21 2 views
1

두 개의 열을 사용하여 기본 키, 트랜잭션 ID 및 순차 번호를 나타내는 테이블이 있습니다.어노테이션을 사용하여 최대 절전 모드에서 복합 기본 키

2.2.3.2.2 절에서 권장되는 내용은 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping이지만 최대 절전 모드 세션을 사용하여이 Entity 개체를 커밋하면 TXN_ID 필드가 삽입 문에 포함되지 않고 BA_SEQ 필드 만 포함됩니다!

무슨 일입니까?

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") 

중요한 것은 내가 밖으로 인쇄입니다 참고 :

@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;} 



그리고 여기가 정확히 실패 할 일이 무엇인지 보여주는 일부 로그 문입니다 : 여기에 관련 코드 발췌 엔티티 개체에 txn_id가 설정되어 있고 다음 insert into 문에 TXN_ID가 포함되어 있지 않으므로 NOT NULL 테이블 제약 조건이 쿼리를 거부합니다.

답변

4

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

이있었습니다.

@IdClass(TxnPK.class) 

다음 내 Entity 클래스에서 원처럼 필드를 직렬화 구현 클래스 TxnPK를 정의뿐만 아니라 동일와 hashCode 방법.

주키의 "보조"필드에 대한 주석. 따라서 BA_SEQ 필드에 입력하십시오. 또한 hashCode를 구현하여 보완합니다.

+0

그러나 완전한 해결책은 아닙니다. 이것은 Txn_id를 커밋하지 않는 문제를 해결했지만 BA_SEQ가 txn_id와 관련하여 고유해야한다는 것을 인식하지 못합니다. 실제로 ba_seq 자체는 고유 한 표현이 잘못되었습니다. 어머나 – Rich

1

@EmbeddedId@Embeddable을 사용하십시오. 대략 :

@EmbeddedId 
private CompositeKey key; 


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

    @Column 
    private int somethingElse; 
} 
관련 문제