休眠启用PostLoad事件



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

我的配置如下:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.provider_class">com.zaxxer.hikari.hibernate.HikariConnectionProvider
        </property>
        <property name="hibernate.connection.tinyInt1isBit">true</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testing</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.connection.pool_size">1</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- OUTPUT STUFF -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.use_sql_comments">false</property>
        <property name="hibernate.format_sql">false</property>
        <!-- SESSION CONTEXT -->
        <property name="hibernate.current_session_context_class">thread</property>
        <!-- CONNECTION POOL hikariCP -->
        <property name="hibernate.hikari.maximumPoolSize">25</property>
        <property name="hibernate.hikari.idleTimeout">30000</property>
        <property name="hibernate.hikari.dataSource.url">jdbc:mysql://localhost:3306/testing</property>
        <property name="hibernate.hikari.dataSource.user">root</property>
        <property name="hibernate.hikari.dataSource.password"></property>
        <property name="hibernate.hikari.dataSource.cachePrepStmts">true</property>
        <property name="hibernate.hikari.dataSource.prepStmtCacheSize">250</property>
        <property name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit">2048</property>
        <property name="hibernate.hikari.dataSource.useServerPrepStmts">true</property>
        <!-- Include the mapping entries -->
        <mapping class="at.adtime.core.v1.model.User"/>
        <mapping class="at.adtime.core.v1.model.Test"/>
    </session-factory>
</hibernate-configuration>

更新:

我有一个名为afterUserLoad的方法,它看起来像这样:

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

它应该加载Test List,并且只将ids放在ArrayList中。

@PostLoad处理至少从5.2.17版本开始在Hibernate中实现。

根据我的研究,@PostLoad@PrePersist和其他类型的JPA注释不适用于Hibernate,我们可以使用Interceptors来代替它们。我使用基于xml的配置,使用Hibernate JPA和Spring。有了Spring,我得到了一个SessionFactory对象,当我为这个对象设置属性时,我注入了一个扩展EmptyInterceptor类的MyInterceptor实例,然后你可以覆盖几个方法,如postLoadonSave等。当你实现这个代码时,覆盖的方法会根据操作的生命周期执行。我没有测试postLoad方法,因为onSave方法对我有效。

更新

基于Spring Java的配置@JeffersonTavares:

弹簧配置类别:

@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

如何在此处实现拦截器。

最新更新