Как использовать @Autowired в классе EntityListener? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть класс DatabaseInitializer, который вставляет некоторые данные через crudrepositories в мою базу данных.Теперь я добавил EntityListener, который должен обновить число в другой таблице (таблица 2), если дата объекта не присутствует в таблице 2. Для этого я пробую @Autowired с crudrepository для этого объекта.Но хранилище не подключено автоматически, оно всегда равно нулю.

EntityListener:

@Component
public class OrderDayIdListener {

    @Autowired
    private static OrderRepository orderRepository;

    @Autowired
    private  OrderDayIdRepository orderDayIdRepository;

    @PrePersist
    private void incrementOrderIdInTable(Order order) {
        LocalDate date = order.getDate();

        OrderDayId orderDayIdObject =         orderDayIdRepository.findByDate(date);

        if(orderDayIdObject == null){
            orderDayIdObject = new OrderDayId(1L, date);
        } else {
            orderDayIdObject.incrementId();
        }

        Long orderDayId = orderDayIdObject.getId();
        order.setOrderDayId(orderDayId);

        orderDayIdRepository.save(orderDayIdObject);
        orderRepository.save(order);
    }
}

Объект:

@EntityListeners(OrderDayIdListener.class)
@Data
@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Column(name ="date")
    private LocalDate date;
}

1 Ответ

0 голосов
/ 20 мая 2019

Как я знаю, вы не можете вставлять управляемые пружины bean-компоненты в JPA EntityListener.Я обнаружил, что нужно создать вспомогательный класс для выполнения работы:

public final class AutowireHelper implements ApplicationContextAware {

private static final AutowireHelper INSTANCE = new AutowireHelper();
private static ApplicationContext applicationContext;

private AutowireHelper() {
}

/**
 * Tries to autowire the specified instance of the class if one of the specified beans which need to be autowired
 * are null.
 *
 * @param classToAutowire the instance of the class which holds @Autowire annotations
 * @param beansToAutowireInClass the beans which have the @Autowire annotation in the specified {#classToAutowire}
 */
public static void autowire(Object classToAutowire, Object... beansToAutowireInClass) {
    for (Object bean : beansToAutowireInClass) {
        if (bean == null) {
            applicationContext.getAutowireCapableBeanFactory().autowireBean(classToAutowire);
            return;
        }
    }
}

@Override
public void setApplicationContext(final ApplicationContext applicationContext) {
    AutowireHelper.applicationContext = applicationContext;
}

/**
 * @return the singleton instance.
 */
public static AutowireHelper getInstance() {
    return INSTANCE;
}}

, а не просто:

public class OrderDayIdListener {

@Autowired
private OrderRepository orderRepository;

@Autowired
private  OrderDayIdRepository orderDayIdRepository;

@PrePersist
public void incrementOrderIdInTable(Order order) {
    AutowireHelper.autowire(this, this.orderRepository);
    AutowireHelper.autowire(this, this.orderDayIdRepository);

    LocalDate date = order.getDate();

    OrderDayId orderDayIdObject = orderDayIdRepository.findByDate(date);

    if(orderDayIdObject == null){
        orderDayIdObject = new OrderDayId(1L, date);
    } else {
        orderDayIdObject.incrementId();
    }

    Long orderDayId = orderDayIdObject.getId();
    order.setOrderDayId(orderDayId);

    orderDayIdRepository.save(orderDayIdObject);
    orderRepository.save(order);
}}

полное объяснение здесь

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