После переноса чистого Spring v4-приложения в весеннюю загрузку 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
, поскольку BeanConfigurerSupport
пропускает ConfigurableListableBeanFactory
.Поэтому обработчик AuditingEntityListener
не настроен, и поэтому аудит не применяется.
Теперь мне интересно, если я что-то делаю неправильно или это проблема с пружинным каркасом или загрузкой пружины.
Любая помощь приветствуется!