在事务内运行惰性集合仍返回LazyInitializationException

时间:2019-02-06 12:25:52

标签: hibernate jpa transactions spring-data-jpa lazy-loading

我已经将Spring Boot与JavaFX应用程序集成在一起, 因此,使用@Transactional注释类将引发NullPointerException( FXMLLoader和spring boot可能存在同步问题) 我决定以任何方式使用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;

那么,她怎么了? 如何在Spring Data JPA中修复此LazyInitializationException?

1 个答案:

答案 0 :(得分:0)

虽然您有一个正在运行的事务,因此有一个活动的会话/持久性上下文,但是您的实体未附加到该持久性上下文。

问题是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-