【问题标题】:Compound Primary Key in Hibernate using AnnotationsHibernate 中使用注解的复合主键
【发布时间】:2011-02-22 11:10:27
【问题描述】:

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

我尝试了第 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 的实体对象,然后下面的 insert into 语句在列表中不包含 TXN_ID,因此 NOT NULL 表约束拒绝查询。

【问题讨论】:

    标签: java sql oracle hibernate ora-01400


    【解决方案1】:

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

    这有帮助。

    @IdClass(TxnPK.class)
    

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

    对主键的“辅助”字段进行注释。所以@Id 在 BA_SEQ 字段上。还实现了 hashCode 和 equals 的补充。

    【讨论】:

    • 虽然不是完整的解决方案。这解决了不提交 Txn_id 的问题,但它没有认识到 BA_SEQ 需要与 txn_id 相关联是唯一的。事实上 ba_seq 本身是唯一的是错误的表示。哎呀
    【解决方案2】:

    使用@EmbeddedId@Embeddable。大致:

    @EmbeddedId
    private CompositeKey key;
    
    
    @Embeddable
    public class CompositeKey {
        @Column
        private int something;
    
        @Column
        private int somethingElse;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多