在HibernateInterceptor中获取新实体实例的生成id的任何方法?

时间:2015-04-29 17:21:01

标签: java hibernate

为了便于讨论,请考虑以下Hibernate注释对象:

@Entity
public class TestModelObject {
    @Id
    @GeneratedValue
    @Column
    private int id;

    @Column
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }    
}

问题是,如何通过HibernateInterceptor(通过session.save持久化)获取新实例的生成ID值?我将概述一些可用的方法,我已经测试过,并解释为什么每个方法都不够用:

  • onSave - 对于要插入的新实例,因为id为null,所以不起作用。这是有道理的,因为在这种情况下,Hibernate并不提前知道ID,因为它是在RDBMS插入时生成的。
  • postFlush - 这包含我之前的数据,但无法使用。它包含一个被刷新的对象的迭代器,包括你感兴趣的那个对象,但是从这个迭代器中取出新保存的实例没有相当简单的方法,没有做像添加一个非常hackish的东西"标记"布尔并在onSave中填充它,并在此处查找。
  • instantiate - 这种数据有效,但无法使用。每次Hibernate实例化一个对象时都会调用它,它包含id作为参数。它肯定会被调用一个新持久化的实体,但是没有理由与实体本身相关联,因为它只包括类名,类型(在本例中为POJO)和id。

我希望像postSave这样的东西会在插入完成后为新创建的实体触发,这将填充生成的id。但我无法找到这样的东西。有没有什么方法可以完成我想要做的事情,而不是采取诸如拯救两次并执行拦截的黑客行为" work"在第二次保存?

0 个答案:

没有答案