hibernate拦截器onsave方法与null可序列化id

标签 hibernate

我已经扩展了 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/

相关文章:

java.lang.Long 没有持久的 id 属性

java - 数据从内存数据库中自动删除

java - Spring - 在配置中使用工厂bean?

java - 如何在hibernate中使用SQL查询按给定ID删除数据库数据?

java - 带有实体类的 NullPointerException

java - Hibernate EhCache没用过?

java - Mysql:使用java和hibernate的java.sql.Time数据类型返回java.sql.Date

java - 如何从 JPA 中的唯一约束异常中获取字段名称

hibernate - Hibernate 中的时间戳

java - 如何在没有实体和 JPA 存储库的情况下在 Spring 中运行 native SQL 查询?