首页 > 解决方案 > @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无法将AuditingEntityListenerbean 配置为BeanConfigurerSupport未命中的ConfigurableListableBeanFactory. 的处理程序AuditingEntityListener因此未设置,因此不应用审核。

我现在想知道我是否做错了什么,或者这是一个弹簧框架或弹簧启动问题。

任何帮助是极大的赞赏!

标签: javahibernatespring-bootspring-data-jpaspring-orm

解决方案


推荐阅读