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上“注入”拦截器。