Запуск отложенной коллекции внутри транзакции, по-прежнему возвращающей исключение LazyInitializationException - PullRequest
0 голосов
/ 06 февраля 2019

Я интегрировал загрузку Spring с приложением JavaFX, поэтому при аннотировании класса с помощью @Transactional возникнет исключение NullPointerException (возможно, существует проблема синхронизации с FXMLLoader и весенней загрузкой). Любым способом я решил создать транзакцию вручную с помощью EntityManager.Моя сущность имеет ленивые свойства. Когда я пытаюсь получить доступ к ленивому свойству внутри транзакции, я все еще получаю LazyInitializationException.

Код для моей сущности:

@Entity
@Table(name = "Product")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idproduct")
    private Long idProduct;

@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
    Set<CommercialePieceItem> commercialePieceItems = new HashSet<>();

    }

Я пробовал много подходов для инициализацииленивая коллекция, но ничего не работает

1 попытка:

 @Autowired
    EntityManagerFactory emf;


  EntityManager entityManager = emf.createEntityManager() ;
                entityManager.getTransaction().begin();
                entityManager.merge(product);
                int qty = product.getCommercialePieceItems().size() ;
                entityManager.getTransaction().commit();
                entityManager.close(); ;

В строке

int qty = product.getCommercialePieceItems (). size ();он генерирует LazyInitializationException

Попытка 2:

 TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager) ; 
                transactionTemplate.execute(new TransactionCallback<Object>() {
                    @Override
                    public Object doInTransaction(TransactionStatus transactionStatus) {
                        Hibernate.initialize(product.getCommercialePieceItems());
                        return null;
                    }
                });

Также он генерирует LazyInitializationException;

Попытка 3: я пытался использоватьвспомогательный сервис:

@Service
public class DatabaseService {

 @Transactional
    public void initializeLazyObject(Object objects) {
        Hibernate.initialize(objects);


    }
}
@Autowired
DatabaseService databaseservice ; 

databaseservice.initializeLazyObject(product.getCommercialePieceItems()) ; 

Как всегда, он вызывает исключение LazyInitializationException;

Итак, в чем ее проблема?Как я могу исправить это LazyInitializationException в Spring Data JPA?

1 Ответ

0 голосов
/ 07 февраля 2019

Пока у вас есть запущенная транзакция и, следовательно, активный контекст сеанса / постоянства, ваша сущность не присоединена к этому контексту постоянства.

Проблема в том, что merge возвращает присоединенный экземпляр, но вы не используететот прикрепленный экземпляр, но отдельный, с которого вы начали.Просто замените

entityManager.merge(product);

на

product = entityManager.merge(product);

, и ваш код должен работать.

Также см. https://vladmihalcea.com/jpa-persist-and-merge/ и https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#merge-T-

...