@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 не может настроить bean-компонент AuditingEntityListener, поскольку BeanConfigurerSupport пропускает ConfigurableListableBeanFactory. Поэтому обработчик AuditingEntityListener не установлен, и поэтому аудит не применяется.

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

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

Ваш клиент содержит метод getCreated () ?!

Mohammadreza Khatami 15.11.2018 11:48

@mohammadreza: да

Julien May 15.11.2018 11:49

Хорошо, это аннотация ломбока. Вы задаете имя для клиента, но каков ваш идеальный ответ ?! Я имею в виду, что createdDate должен иметь значение null, потому что вы его не устанавливаете?

Mohammadreza Khatami 15.11.2018 11:53

Что ж, это и есть идея аудита. все устанавливается автоматически при сохранении.

Julien May 15.11.2018 11:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
348
0

Другие вопросы по теме