如何为策略GenerationType.TABLE重写Hibernate Id生成

时间:2014-05-02 08:31:25

标签: java oracle hibernate jpa

当所选策略为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

的任何问题

1 个答案:

答案 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