Прослушиватели событий Hibernate для обратных вызовов JPA

Как я могу включить прослушиватели событий Hibernate, которые обрабатывают обратные вызовы JPA?

В настоящее время я использую Hibernate 4 с конфигурацией SessionFactory, но обратные вызовы 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("[email protected]");
        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

person dom    schedule 05.02.2015    source источник
comment
Пожалуйста, добавьте вывод программы   -  person meskobalazs    schedule 05.02.2015
comment
Hibernate: вставьте в TEMP (электронная почта, имя, список) значения (?,?,?) Объект успешно сохраняется   -  person dom    schedule 05.02.2015
comment
А что вы ожидали?   -  person meskobalazs    schedule 05.02.2015
comment
Объект не будет сохраняться без гибернации: вставьте в TEMP (электронная почта, имя, список) значения (?, ?, ?) Объект успешно сохраняется   -  person dom    schedule 05.02.2015
comment
Я обновляю ваш вопрос этой информацией, в следующий раз, пожалуйста, не стесняйтесь добавлять их, это делает вопрос намного лучше.   -  person meskobalazs    schedule 05.02.2015
comment
Я не уверен на сто процентов, но, возможно, EntityListener не работает с SessionFactory, только с EntityManager   -  person meskobalazs    schedule 05.02.2015
comment
да, я уже гуглил это и получил то же самое, что и у вас, но я думаю, что мы можем добиться этого с помощью конфигурации, но не знаю, какая конфигурация   -  person dom    schedule 05.02.2015


Ответы (2)


Этот вопрос в основном задавал то же самое.

Итак, оказывается, что эти аннотации прослушивателя объектов JPA работают только тогда, когда вы используете EntityManager в Hibernate (что понятно). Поэтому, если вы хотите использовать эти аннотации, вам следует отказаться от SessionFactory и использовать JPA-жалобу EntityManager или EntityManagerFactory.

Я также рекомендую этот подход, потому что, если вы пытаетесь использовать аннотации JPA, логично выбрать чистое решение JPA, не привязывая себя к решению, специфичному для Hibernate, то есть SessionFactory.

person meskobalazs    schedule 05.02.2015

Добавьте файл с именем org.hibernate.integrator.spi.Integrator, содержащий одну строку.

org.hibernate.jpa.event.spi.JpaIntegrator

в папке META-INF/services. Это позволит использовать аннотации жизненного цикла JPA, включая @EntityListeners для конфигураций на основе sessionFactory.

person Martin Petrus    schedule 11.06.2015
comment
Я пробовал это в спящем режиме 5.1.0, но prepersist до сих пор не работает. Любое другое предложение по этой проблеме? - person Mustafa Kemal; 09.03.2017
comment
Я добавил JpaIntegrator() с помощью Hibernate Bootstrapping следующим образом: BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() .applyIntegrator(new JpaIntegrator()) .build(); Чтобы он работал, вам нужно загрузить Hibernate вручную. Это заставило его работать для Hibernate 5.2. - person fjalvingh; 29.08.2018