我已经扩展了 EmptyInterceptor,并且想要记录新创建的实体 ID。 onSave方法中Serialized id为null,实体主键也为null。我们使用 hbm 文件来映射 pojo 类和主键的生成器 class="identity"。
最佳答案
这是因为EmptyInterceptor将在保存实体之前调用。
尝试使用postFlush ,其中 ID 可用。
这是一个使用 Hibernate 4.3
的小示例:
实体Student.java
@Entity
public class Student {
@Id
@GeneratedValue
private int id;
private String name;
}
拦截器类:LogInterceptor.java
public class LogInterceptor extends EmptyInterceptor {
Session session;
public void setSession(Session session) {
this.session = session;
}
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
System.out.println("Entered onSave : class - " + entity.getClass());
if (entity instanceof Student) {
Student s = (Student) entity;
System.out.println("class:" + entity.getClass() + " , id: "+s.getId());
}
return false;
}
public void postFlush(Iterator iterator) {
System.out.println("Entered postFlush");
while (iterator.hasNext()) {
Object obj = iterator.next();
if (obj instanceof Student) {
Student s = (Student) obj;
System.out.println("class:" + s.getClass() + " , id: "+s.getId());
}
}
}
public Session getSession() {
return session;
}
}
测试代码:
Configuration configuration = new Configuration().setInterceptor( new LogInterceptor() );
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
session.getTransaction().begin();
Student s1 = new Student();
s1.setName("Test");
session.save(s1);
session.getTransaction().commit();
输出:
Entered onSave : class - class Student
class:class Student , id: 1
Entered postFlush
class:class Student , id: 1
在我的示例中,我在 onSave
方法本身获取了 ID。
关于hibernate拦截器onsave方法与null可序列化id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640278/