当所选策略为GenerationType.TABLE
时,我需要覆盖从Hibernate为实体生成的值。
需要覆盖生成的值的一个示例是,当应用程序的某个其他层已经提供了id字段的值时,我不希望Hibernate生成新值,而是使用提供的值之一。
这是实体的id部分(AdvEntity)
@TableGenerator(name = "AID_SERIAL",
table = "serial",
pkColumnName="name", pkColumnValue = "adv",
valueColumnName = "no", allocationSize = 1)
@GeneratedValue(strategy= GenerationType.TABLE, generator="AID_SERIAL")
@Column(name = "AID")
@Id
public Integer getAid() {
return aid;
}
我找到了许多答案,描述了在使用GenerationType.SEQUENCE
时如何解决问题,但无法找到GenerationType.TABLE
答案 0 :(得分:2)
在使用调试器完成Hibernate中的代码后,我提出了以下代码来解决我的问题:
@GenericGenerator(name = "AID_SERIAL", strategy = "my.package.structure.AdvAidValueGenerator",
parameters = {
@Parameter(name="table", value="serial"),
@Parameter(name="primary_key_column", value="name"),
@Parameter(name="max_lo", value="0"),
@Parameter(name="table", value="serial"),
@Parameter(name="value_column", value="no"),
@Parameter(name="primary_key_value", value="adv")
})
@GeneratedValue(generator="AID_SERIAL")
@Column(name = "AID")
@Id
public Integer getAid() {
return aid;
}
public class AdvAidValueGenerator extends MultipleHiLoPerTableGenerator {
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
if(!(object instanceof AdvEntity)) {
throw new IllegalArgumentException("AdvAidValueGenerator should only be used for AdvEntity");
}
final AdvEntity advEntity = (AdvEntity) object;
final Integer presentAid = advEntity.getAid();
if(null == presentAid) {
return super.generate(session, object);
}
return presentAid;
}
}
请注意,此策略是特定于Hibernate的,不适用于其他JPA供应商
我还应该补充一点,我使用的是Hibernate版本4.3.1