【问题标题】:Hibernate event listeners for JPA callbacksJPA 回调的休眠事件侦听器
【发布时间】:2015-04-05 02:29:54
【问题描述】:

如何启用处理 JPA 回调的 Hibernate 事件侦听器?

目前我正在使用带有 SessionFactory 配置的 Hibernate 4,但是当我持久化一个对象时,JPA 回调没有正常运行。

欢迎提出任何建议。

源代码

临时实体类:

package com.esp.entity;

import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostLoad;
import javax.persistence.Table;

import com.esp.aaa.TempVal;

@Entity
@EntityListeners(value=TempVal.class)
@Table(name="TEMP")
public class Temp {
    private int id;
    private String name;
    private String email;
    private int roll;

    @Id @GeneratedValue
    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;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getRoll() {
        return roll;
    }
    public void setRoll(int roll) {
        this.roll = roll;
    }
    @PostLoad
    public void load(){
        System.out.println("post load called here");
    }
}

TempVal 类:

package com.esp.aaa;

import javax.persistence.PrePersist;

public class TempVal {
    @PrePersist
    public void validate(Object temp){
        System.out.println("Object will persist now");
    }
}

MainClass 类:

package com.esp.aaa;

import org.hibernate.Session;
import com.esp.entity.Temp;
import com.esp.utility.HibernateUtils;

public class MainClass {
    public static void main(String args[]) {
        HibernateUtils.createSessionFactory();
        Session session=HibernateUtils.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Temp temp=new Temp();

        temp.setEmail("abc@gmail.com");
        temp.setName("Lucky");
        temp.setRoll(1112);

        session.save(temp);
        System.out.println("Object persist successfully");

        session.getTransaction().commit();
        HibernateUtils.shutdown();
    }
}

休眠配置:

<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/demo</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.current_session_context_class">thread</property>

        <mapping class="com.esp.entity.Temp"/>
    </session-factory>
</hibernate-configuration>

程序输出

程序输出如下:

Hibernate: insert into TEMP (email, name, roll) values (?, ?, ?)
Object persist successfully

预期的输出是:

Object will persist now
Hibernate: insert into TEMP (email, name, roll) values (?, ?, ?)
Object persist successfully

【问题讨论】:

  • 请添加程序输出
  • 休眠:插入到 TEMP(电子邮件,姓名,卷)值(?,?,?)对象成功持久
  • 你期待什么?
  • 对象不会保持休眠状态:插入到 TEMP(电子邮件、姓名、卷)值(?、?、?)对象成功保持
  • 我不确定,但可能EntityListeners 不与SessionFactory 合作,仅与EntityManager 合作

标签: java hibernate jpa hibernate-4.x


【解决方案1】:

添加一个名为 org.hibernate.integrator.spi.Integrator 的文件,其中包含一行

org.hibernate.jpa.event.spi.JpaIntegrator

在您的 META-INF/services 文件夹中。这将启用 JPA 生命周期注释,包括用于基于 sessionFactory 的配置的 @EntityListeners。

【讨论】:

  • 我在 hibernate 5.1.0 中尝试过,但 prepersist 仍然没有工作。关于这个问题还有其他建议吗?
  • 我使用 Hibernate Bootstrapping 添加了 JpaIntegrator(),如下: BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() .applyIntegrator(new JpaIntegrator()) .build();为了让它工作,你需要手动引导 Hibernate。这使它适用于 Hibernate 5.2。
【解决方案2】:

这个question基本上问的一样。

事实证明,这些 JPA 实体侦听器注释仅在您在 Hibernate 中使用 EntityManager 时才有效(这是可以理解的)。所以如果你想使用这些注解,你应该抛弃SessionFactory,使用JPA-complaint EntityManagerEntityManagerFactory

我也推荐这种方法,因为如果您尝试使用 JPA 注释,那么选择纯 JPA 解决方案是合乎逻辑的,而无需将自己绑定到特定于 Hibernate 的解决方案 - 即SessionFactory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2011-07-06
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多