Составной первичный ключ в Hibernate с использованием аннотаций - PullRequest
1 голос
/ 21 мая 2010

У меня есть таблица, которая использует два столбца для представления своего первичного ключа, идентификатора транзакции, а затем порядковый номер.

Я попробовал то, что было рекомендовано http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping в разделе 2.2.3.2.2, но когда я использовал сеанс Hibernate для фиксации этого объекта Entity, он пропускает поле 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 в листинг, и, следовательно, ограничение таблицы NOT NULL отклоняет запрос.

Ответы [ 2 ]

4 голосов
/ 21 мая 2010

как создать составной первичный ключ (аннотация постоянства Java)

Это помогло.

@IdClass(TxnPK.class)

и затем определение Serializable реализующего класса TxnPK с полями, как я хотел в моем классе Entity, а также с методами equals и hashCode.

аннотация на «вторичные» поля первичного ключа. Так что @Id в поле BA_SEQ. Также реализован hashCode и эквивалентен дополнению.

1 голос
/ 21 мая 2010

Используйте @EmbeddedId и @Embeddable. Грубо:

@EmbeddedId
private CompositeKey key;


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

    @Column
    private int somethingElse;
}
...