Нулевая коллекция (Lazy entity) в параметрах метода Spring @Async - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу обновить сущность и в асинхронном методе сравнить старую версию сущности с новой, но когда я передаю старую версию сущности в параметрах асинхронного метода, все ленивые атрибуты сущностиноль.

@Entity
public class Item {
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "production_input", inverseJoinColumns        
    @JoinColumn(name = "production_id"))
    private List<Production>                inputProduction; 
}

@Service
public class ItemService {
    @Autowired
    @Qualifier("entityManagerFactory")
    private EntityManagerFactory emFactory;
    @Autowired
    private ItemRepository itemRepository;
    @Autowired
    private ProductionService productionService;

    public update(Item item) {
       EntityManager entityManager = emFactory.createEntityManager();
       Item oldItem = entityManager.find(item.getClass(),item.getId());
       this.itemRepository().save(item);
       this.productionService.asyncComputeProductionUpdate(oldItem, item,this);
    }

    public void computeProductionUpdate(Item oldItem,Item item){
     .... //use of oldItem and new item.
    }
 }

@Service
public class ProductionService {
    @Autowired
    private AsyncProductionProcess asyncProductionProcess;

    @Async
    public void asyncComputeProductionUpdate(Item oldItem,Item item,ItemService itemService) {

    this.asyncProductionProcess.setProductionService(itemService);
    this.asyncProductionProcess.asyncComputeProductionUpdate(oldItem, item);
    }
}

@Service
public class AsyncProductionProcess {
    private ItemService itemService;

    public void setItemService(ItemService itemService ) {
        this.itemService = itemService ;
    }

    @Transactional
    public void asyncComputeProductionUpdate(Item oldItem, Item item) {
        this.itemService.computeProductionUpdate(oldItem, item);
   }
}

Моя идея состояла в том, чтобы объявить новую фабрику диспетчера сущностей для получения версии в базе данных, и таким образом у меня будет новая версия в транзакции и старая версия, но когда я отправлю две версии впараметры асинхронного метода, с новой версией все в порядке, я могу получить доступ ко всем спискам, но для старой версии у меня есть нуль в списках, я попытался весенний класс sharedentitymanagercreator, чтобы создать менеджер сущностей, но с этим классом вВ асинхронном методе старая и новая версии имеют одинаковые значения списков.со всем, что я пробовал, я столкнулся с двумя случаями: первый - старая версия имеет нулевой список, а второй - старая и новая версии совпадают.Первый вызванный метод - это обновление (Item item) в ItemService.

...