我有一个PROPERTY
表,其主键定义为(REF_1_ID, PROPERTY_ID, PROPERTY_IDX)
,其中PROPERTY_IDX
的范围从0到n,表示(REF_1_ID, PROPERTY_ID)
的相同值。
我想将它留给Hibernate来管理PROPERTY_IDX
的值,以便我可以为新对象设置它null
并在保存时填充它。
实现这一目标最直接的方法是什么?
答案 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();
}
}