【发布时间】:2014-03-15 03:03:13
【问题描述】:
我有一个 Hibernate 拦截器,我想对 Hibernate 进行 onLoad() 调用。我这样做是因为我希望 JPA 实体有一个由 Spring 注入的 SecureRandom 实例。由于 JPA 上下文和 Spring 上下文不混合,这是从 Spring 上下文到 JPA 上下文的桥梁。
我的 Java 配置中有“两个地方”,我在其中设置 Hibernate 4 的东西。我在下面包含了他们的输入。根据这个(https://jira.springsource.org/browse/SPR-8940),我认为要以编程方式设置 Hibernate 拦截器,我需要访问 LocalSessionFactoryBean。也许通过 LocalContainerEntityManagerFactoryBean?我只是不知道该怎么做,或者我是否需要重新配置我设置 Hibernate 东西的方式。任何帮助将不胜感激!
@Bean
JpaTransactionManager jpaTransactionManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
jpaTransactionManager.setEntityManagerFactory(localContainerEntityManagerFactoryBean.getObject());
return jpaTransactionManager;
}
@Bean(name = "LocalContainerEntityManagerFactory")
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(BasicDataSource jdbcConnection) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class.forName("com.mysql.jdbc.Driver").newInstance();
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setDataSource(jdbcConnection);
localContainerEntityManagerFactoryBean.setPackagesToScan(this.getClass().getPackage().getName());
Properties jpaProperties = new Properties();
jpaProperties.setProperty("hibernate.hbm2ddl.auto", "create");
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
hibernateJpaVendorAdapter.setShowSql(true);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
return localContainerEntityManagerFactoryBean;
}
@Component
public class InvitationEntityInterceptor extends EmptyInterceptor {
@Autowired
SecureRandom secureRandom;
@Override
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
if(entity instanceof Invitation) {
Invitation invitation = (Invitation) entity;
invitation.setRandom(secureRandom);
}
return false;
}
}
【问题讨论】: