代码之家  ›  专栏  ›  技术社区  ›  Rich khmarbaise

使用注释在休眠中复合主键

  •  1
  • Rich khmarbaise  · 技术社区  · 16 年前

    我有一个表,它使用两列来表示它的主键、事务ID和序列号。

    我试了推荐的方法 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping 在2.2.3.2.2节中,但是当我使用Hibernate会话提交这个实体对象时,它会在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 in to语句在列表中不包含txn_id,因此不为空的表约束拒绝查询。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

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

    这有帮助。

    @IdClass(TxnPK.class)
    

    然后定义一个可序列化的实现类txnpk,其中包含我在实体类中想要的字段,以及equals和hashcode方法。

    主键的“辅助”字段上的注释。那么,在ba_seq字段上的@id。还实现了hashcode和等于supplement。

        2
  •  1
  •   Bozho    16 年前

    使用 @EmbeddedId @Embeddable . 粗略地说:

    @EmbeddedId
    private CompositeKey key;
    
    
    @Embeddable
    public class CompositeKey {
        @Column
        private int something;
    
        @Column
        private int somethingElse;
    }
    
    推荐文章