Java 休眠启用后加载事件

Java 休眠启用后加载事件,java,hibernate,events,loading,Java,Hibernate,Events,Loading,从数据库加载模型后,我当前正尝试使用@PostLoad注释进行一些处理。但目前看来我的方法不会被触发。我不使用EntityManager,因此我正在寻找一种方法来启用此事件 我的配置如下所示: @PostLoad public void afterUserLoad() { ArrayList<String> computedIds = new ArrayList<String>(); for (Test test : this.Test) {

从数据库加载模型后,我当前正尝试使用
@PostLoad
注释进行一些处理。但目前看来我的方法不会被触发。我不使用
EntityManager
,因此我正在寻找一种方法来启用此事件

我的配置如下所示:

@PostLoad
public void afterUserLoad() {
    ArrayList<String> computedIds = new ArrayList<String>();
    for (Test test : this.Test) {
        computedIds.add(test.getId());
    }
    this.setTestIds(computedIds);
}

com.zaxxer.hikari.hibernate.HikariConnectionProvider
真的
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/testing
根
1.
org.hibernate.dialogue.mysql5dialogue
更新
真的
假的
假的
线
25
30000
jdbc:mysql://localhost:3306/testing
根
真的
250
2048
真的
更新:

我有一个名为
afterUserLoad
的方法,如下所示:

@PostLoad
public void afterUserLoad() {
    ArrayList<String> computedIds = new ArrayList<String>();
    for (Test test : this.Test) {
        computedIds.add(test.getId());
    }
    this.setTestIds(computedIds);
}
@PostLoad
public void afterUserLoad(){
ArrayList ComputedId=新的ArrayList();
用于(测试:此.Test){
add(test.getId());
}
这个.setTestIds(computedId);
}

根据我的研究,
@PostLoad
@PrePersist
和其他类型的JPA注释对Hibernate不起作用,相反,我们可以使用拦截器。我正在使用HibernateJPA和Spring进行基于xml的配置。使用Spring,我得到了一个
SessionFactory
对象,当我为这个对象设置属性时,我注入了一个
MyInterceptor
实例,它扩展了
EmptyInterceptor
类,然后你可以跳过几个方法,比如
postLoad
onSave
,等等,重写的方法根据操作的生命周期执行。我没有测试
postLoad
方法,因为
onSave
方法适合我

更新

基于Spring Java的配置@JeffersonAvares:

Spring配置类:

@Configuration
public class SpringConfig {

    @Bean
    public BasicDataSource basicDataSource(){ // org.apache.commons.dbcp2.BasicDataSource Object
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        basicDataSource.setUrl("jdbc:sqlserver://172.125.25.7:1433;databaseName=LIST_FIRMAS;selectMethod=direct;");
        basicDataSource.setUsername("user");
        basicDataSource.setPassword("password");
        return basicDataSource;
    }

    @Bean
    public MyInterceptor myInterceptor(){  // Your interceptor
        return new MyInterceptor();
    }

    @Bean(name = "sessionFactory")
    public SessionFactory sessionFactory() throws IOException{
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();

        localSessionFactoryBean.setDataSource(basicDataSource()); // DataSource

        localSessionFactoryBean.setAnnotatedClasses(
                com.isapeg.timbrado.model.SalMinimo.class,
                com.isapeg.timbrado.model.DeduccionCnom12.class,
                com.isapeg.timbrado.model.PercepcionCnom12.class); // JPA entity classes ....

        localSessionFactoryBean.setEntityInterceptor(myInterceptor()); // Setting your Interceptor

        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
        properties.put("hibernate.current_session_context_class", "thread");
        properties.put("hibernate.show_sql", "false");
        localSessionFactoryBean.setHibernateProperties(properties);  // Setting Hibernate Properties

        localSessionFactoryBean.afterPropertiesSet();  // Session Factory initialization

        return localSessionFactoryBean.getObject();  // Returning of SessionFactory Object
    }

    // other beans ....
}
要测试会话工厂对象的内容:

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
if (sessionFactory == null) {
    System.out.println("SessionFactory obj is null");
} else {
    Session session = sessionFactory.openSession();
    System.out.println("Session obj: " + session);
    System.out.println("isOpen: " + session.isOpen() + "  isConnected: " + session.isConnected());
    session.close();
}
更新2


如何实现拦截器。

根据我的研究,
@PostLoad
@PrePersist
和其他类型的JPA注释不适用于Hibernate,我们可以使用拦截器。我正在使用HibernateJPA和Spring进行基于xml的配置。使用Spring,我得到了一个
SessionFactory
对象,当我为这个对象设置属性时,我注入了一个
MyInterceptor
实例,它扩展了
EmptyInterceptor
类,然后你可以跳过几个方法,比如
postLoad
onSave
,等等,重写的方法根据操作的生命周期执行。我没有测试
postLoad
方法,因为
onSave
方法适合我

更新

基于Spring Java的配置@JeffersonAvares:

Spring配置类:

@Configuration
public class SpringConfig {

    @Bean
    public BasicDataSource basicDataSource(){ // org.apache.commons.dbcp2.BasicDataSource Object
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        basicDataSource.setUrl("jdbc:sqlserver://172.125.25.7:1433;databaseName=LIST_FIRMAS;selectMethod=direct;");
        basicDataSource.setUsername("user");
        basicDataSource.setPassword("password");
        return basicDataSource;
    }

    @Bean
    public MyInterceptor myInterceptor(){  // Your interceptor
        return new MyInterceptor();
    }

    @Bean(name = "sessionFactory")
    public SessionFactory sessionFactory() throws IOException{
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();

        localSessionFactoryBean.setDataSource(basicDataSource()); // DataSource

        localSessionFactoryBean.setAnnotatedClasses(
                com.isapeg.timbrado.model.SalMinimo.class,
                com.isapeg.timbrado.model.DeduccionCnom12.class,
                com.isapeg.timbrado.model.PercepcionCnom12.class); // JPA entity classes ....

        localSessionFactoryBean.setEntityInterceptor(myInterceptor()); // Setting your Interceptor

        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
        properties.put("hibernate.current_session_context_class", "thread");
        properties.put("hibernate.show_sql", "false");
        localSessionFactoryBean.setHibernateProperties(properties);  // Setting Hibernate Properties

        localSessionFactoryBean.afterPropertiesSet();  // Session Factory initialization

        return localSessionFactoryBean.getObject();  // Returning of SessionFactory Object
    }

    // other beans ....
}
要测试会话工厂对象的内容:

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
if (sessionFactory == null) {
    System.out.println("SessionFactory obj is null");
} else {
    Session session = sessionFactory.openSession();
    System.out.println("Session obj: " + session);
    System.out.println("isOpen: " + session.isOpen() + "  isConnected: " + session.isConnected());
    session.close();
}
更新2


如何实现拦截器。

@PostLoad handling至少是从Hibernate的5.2.17版本开始实现的。

@PostLoad handling至少是从Hibernate的5.2.17版本开始实现的。

您在哪里标记了此
@PostLoad
?我已经尝试在用户类中使用注释与我在hibernate配置中尝试使用的
方法相比,userload之后的
方法无法按预期工作。有什么想法吗?当您加载
Test
类的实例时,这应该是可行的。你在做吗?您是否准备了单元测试或其他东西来调试此方法?我尝试从数据库加载它,但当我尝试访问应设置为抛出此PostLoad方法的testIds ArrayList时,它为null。我想我需要说的是,我没有使用EntityManager——我使用的是SessionFactory,其余的我自己做——我需要在配置中的某个地方启用它吗?看起来这是HibernateSessionFactory的问题。我没有设法让它工作,但这是我目前发现的。你在哪里标记了这个
@PostLoad
?我尝试在User类中使用方法
afterUserLoad
,而不是在hibernate配置中尝试使用
,没有按预期工作。有什么想法吗?当您加载
Test
类的实例时,这应该是可行的。你在做吗?您是否准备了单元测试或其他东西来调试此方法?我尝试从数据库加载它,但当我尝试访问应设置为抛出此PostLoad方法的testIds ArrayList时,它为null。我想我需要说的是,我没有使用EntityManager——我使用的是SessionFactory,其余的我自己做——我需要在配置中的某个地方启用它吗?看起来这是HibernateSessionFactory的问题。我没有设法让它工作,但这是我目前发现的。我目前正在学习spring,但我使用的是基于java的配置。有什么办法让它工作吗?我知道如何创建拦截器,但我不知道如何在spring上“注入”拦截器。我目前正在学习spring,但我正在使用基于java的配置。有什么办法让它工作吗?我知道如何创建拦截器,但我不知道如何在spring上“注入”拦截器。