我已经将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?
答案 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-