@EnableJpaAuditing и LocalSessionFactoryBean - PullRequest
0 голосов
/ 15 ноября 2018

После переноса чистого 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 не настроен, и поэтому аудит не применяется.

Теперь мне интересно, если я что-то делаю неправильно или это проблема с пружинным каркасом или загрузкой пружины.

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...