在Hibernate中使用递增列映射复合键

时间:2010-09-14 11:42:50

标签: java hibernate

我有一个PROPERTY表,其主键定义为(REF_1_ID, PROPERTY_ID, PROPERTY_IDX),其中PROPERTY_IDX的范围从0到n,表示(REF_1_ID, PROPERTY_ID)的相同值。

我想将它留给Hibernate来管理PROPERTY_IDX的值,以便我可以为新对象设置它null并在保存时填充它。

实现这一目标最直接的方法是什么?

1 个答案:

答案 0 :(得分:1)

  

对于(REF_1_ID,PROPERTY_ID)

的相同值

您可以检索有多少属性实体(REF_1_ID,PROPERTY_ID)

Integer indexValue = (Integer)

session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId")
       .setParameter("referenceId", referenceId)
       .setParameter("propertyId", propertyId)
       .iterate()
       .next();

然后你设置

propertyId.setIndexValue(indexValue);

您可以使用HibernateInterceptor来实现此功能(onSave方法)在处理此场景时请记住并发问题

封装如下

@IdClass(PropertyId.class)
public class Property {

    private Integer referenceId;
    private Integer propertyId;
    private Integer indexValue;

    /**
      * You can use some repository instead
      *
      * setUp by using Either constructor Or setter injection
      */
    private Session session;

    public Property() {}
    public Property(Session session) {
        this.session = session;
    }

    @Id 
    public Integer getIndexValue() {
        if(indexValue != null)
            return indexValue;

        return (Integer)

            session.createQuery("select count(*) from Property p where p.propertyId.rederenceId = :referenceId and p.propertyId.propertyId = :propertyId")
                   .setParameter("referenceId", referenceId)
                   .setParameter("propertyId", propertyId)
                   .iterate()
                   .next();
    }

}