【问题标题】:How to override Hibernate Id generation for strategy GenerationType.TABLE如何为策略 GenerationType.TABLE 覆盖 Hibernate Id 生成
【发布时间】:2014-05-02 08:31:25
【问题描述】:

当所选策略为 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 的任何答案

【问题讨论】:

    标签: java oracle hibernate jpa


    【解决方案1】:

    在使用调试器检查 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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 2012-06-06
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2012-12-24
    相关资源
    最近更新 更多