Как избежать LazyInitializationException при доступе к вложенным ленивым коллекциям в весенней партии с параллельной обрJAVA

Программисты JAVA общаются здесь
Anonymous
Как избежать LazyInitializationException при доступе к вложенным ленивым коллекциям в весенней партии с параллельной обр

Сообщение Anonymous »

Я работаю над работой весенней партии с параллельной обработкой куски. Проблема, с которой я сталкиваюсь, заключается в LazyInitializationException из-за вложенных коллекций с ленивым нагрузкой в ​​моих объектах JPA.
Я использую JpapagingItemreader для чтения, JPatransactionManager для управления транзакциями и SimpleAsyNctAskexecutor Paralling. /> setup: < /strong> < /p>
  • Spring Boot: 3.3.4 < /li>
    Spring Parath: 5.1.2 < /li>
    Transaction Manager: JpatransactionManager < /code> < /li>
    Задача SimpleAsynctaskexeCutor

Простой пример:

customer entity:
@Entity
public class Customer {

@Id
private Long id;

@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
}

Order Entity:
Отношение @onetomany является fetchtype.lazy по умолчанию.
@Entity
public class Order {

@Id
private Long id;

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List types;

// Other @OneToMany collection fields...

}

Конфигурация пакета пружины:
Я использую jpapagingItemreader и itemprocessor . Шаг параллелизируется с использованием простой.@Bean
public JpaPagingItemReader customerItemReader(EntityManagerFactory entityManagerFactory) {
return new JpaPagingItemReaderBuilder()
.name("customerItemReader")
.entityManagerFactory(entityManagerFactory)
.queryString("SELECT c FROM Customer c")
.pageSize(100)
.build();
}

@Bean
public Step processCustomersStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager,
JpaPagingItemReader customerItemReader,
ItemProcessor customerItemProcessor,
ItemWriter customerItemWriter,
TaskExecutor taskExecutor) {
return new StepBuilder("processCustomersStep", jobRepository)
.chunk(100, transactionManager)
.reader(customerItemReader)
.processor(customerItemProcessor)
.writer(customerItemWriter)
.taskExecutor(taskExecutor)
.build();
}

При запуске пакетного задания я получаю следующую ошибку при доступе к ленивому заряду или его вложенной коллекции типов в Itemprocessor :
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myapp.Order.types: could not initialize proxy - no Session

Что я попробовал:
  • Извлечение с помощью соединения : я не могу использовать соединение fetch , потому что
    Order< /code> сущность содержит несколько вложенных сборов с ленивым загруженным,
    , приводя к большим, неэффективным вопросам. /> itemprocessor .
Вопрос:
Как я могу предотвратить LazyInitializationException в шаге Spring Batch с параллельными кусочками при использовании jPapagingItemread и jpatransactionmangragemangragemangragemangrangemangrangeman? /> Должен ли я обрабатывать EntityManager по-разному, или есть еще один шаблон для обработки сущностей с вложенными коллекциями с ленивым нагруженным нагрузкой на параллельно? Создание нового экземпляра клиента и копирование вложенного порядка и связанных с ним типов. Это требует доступа к ленивым нагруженным коллекциям в Premprocessor, где происходит LazyInitializationException.@Component
public class CustomerItemProcessor implements ItemProcessor {

@Override
public Customer process(Customer customer) throws Exception {
Customer newCustomer = new Customer();
Order order = new Order();
order.setTypes(customer.getOrder().getTypes()));
newCustomer.setOrder(order);
return newCustomer;
}

}

worper:
itempriter использует инъекцию EntityManager для сохранения обработанных сущностей.@Bean
public JpaItemWriter customerItemWriter(EntityManagerFactory entityManagerFactory) {
return new JpaItemWriterBuilder()
.entityManagerFactory(entityManagerFactory)
.build();
}

jpa-транзакционной менеджер:
JpatransactionManager используется для управления объемом транзакции в рамках пакетного задания. @Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... ollections

Вернуться в «JAVA»