java - @EnableJpaAuditing 和 LocalSessionFactoryBean
问题描述
将纯 spring v4 应用程序迁移到 spring boot 2.1 后,我遇到了一些审计问题。
出于演示目的,我创建了一个小演示应用程序,其设置基本上如下所示:
@SpringBootApplication
public class HibernateWithJpaApplication {
public static void main(String[] args) {
SpringApplication.run(HibernateWithJpaApplication.class, args);
}
}
@EnableJpaAuditing
@Configuration
@EnableJpaRepositories(basePackages = "com.github.hibernatewithjpa.repository", entityManagerFactoryRef = "sessionFactory")
@EnableTransactionManagement
public class ApplicationConfiguration {
@Bean
public LocalSessionFactoryBean sessionFactory(ConfigurableListableBeanFactory beanFactory, DataSource dataSource) {
Properties properties = new Properties();
properties.setProperty(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan("com.github.hibernatewithjpa.domain");
localSessionFactoryBean.setHibernateProperties(properties);
return localSessionFactoryBean;
}
}
我也有一个非常简单的存储库和实体。
public interface ClientRepository extends PagingAndSortingRepository<Client, Integer> {
}
@Data
@Entity
@Table(name = "client")
@EntityListeners(AuditingEntityListener.class)
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@CreatedDate
private Date created;
}
以下测试表明未应用审计:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = HibernateWithJpaApplication.class)
public class ClientRepositoryTest {
@Autowired
private ClientRepository clientRepository;
@Test
public void test() {
Client client = new Client();
client.setName("df");
this.clientRepository.save(client);
client = this.clientRepository.findById(client.getId()).get();
assertThat(client.getCreated()).isNotNull();
}
}
此外,该应用程序同时使用 JPA 和本机 Hibernate 查询。根据https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#orm-jpa-hibernate使用LocalSessionFactoryBean
应该是我们设置的正确方法。所以使用LocalContainerEntityManagerFactoryBean
并不是一个真正的选择。
调试时,我可以看到AnnotationBeanConfigurerAspect
无法将AuditingEntityListener
bean 配置为BeanConfigurerSupport
未命中的ConfigurableListableBeanFactory
. 的处理程序AuditingEntityListener
因此未设置,因此不应用审核。
我现在想知道我是否做错了什么,或者这是一个弹簧框架或弹簧启动问题。
任何帮助是极大的赞赏!
解决方案
推荐阅读
- libusb - 使用 libusb 的 CH340 握手
- java - 为什么带有参数 StringBuffer 的类 String 构造函数方法使用同步块而带有 StringBuilder 的构造函数不使用?
- python - 如何设置从 python 列表传递到 html 进度条的值
- google-chrome - 如何删除首次启动时以 Chrome 状态运行的 PWA
- symfony - Twig 如果带有角度变量
- c - 将 jvm 库动态加载到 windows 上的 go 代码中
- node.js - 节点不删除 ETAG 标头
- powershell-core - 如何使用 PowerShell Core 写入调试流,以便由 SysInternals DBGVIEW.EXE 捕获
- database - Corda 分类帐修剪可能吗?
- vuejs2 - 只有当两个复选框都被激活时,提交按钮才应该是可点击的