运行 事务中的惰性集合仍在返回 LazyInitializationException
Running lazy collection inside a Transaction Still returning LazyInitializationException
我已经将 Spring 引导与 JavaFX 应用程序集成,
所以用@Transactional 注释 class 会抛出 NullPointerException (
也许 FXMLLoader 和 spring 引导存在同步问题)
我决定使用 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() ; it throws a
LazyInitializationException
尝试 2:
TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager) ;
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
Hibernate.initialize(product.getCommercialePieceItems());
return null;
}
});
Also it throws a 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?
虽然您有一个 运行 事务,因此有一个活动的 session/persistence 上下文,但您的实体未附加到该持久性上下文。
问题是 merge
returns 一个附加实例,但您使用的不是那个附加实例,而是您开始使用的分离实例。
只需替换
entityManager.merge(product);
与
product = entityManager.merge(product);
你的代码应该可以工作。
另请参阅 https://vladmihalcea.com/jpa-persist-and-merge/ and https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#merge-T-
我已经将 Spring 引导与 JavaFX 应用程序集成, 所以用@Transactional 注释 class 会抛出 NullPointerException ( 也许 FXMLLoader 和 spring 引导存在同步问题) 我决定使用 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() ; it throws a LazyInitializationException
尝试 2:
TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager) ;
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
Hibernate.initialize(product.getCommercialePieceItems());
return null;
}
});
Also it throws a 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?
虽然您有一个 运行 事务,因此有一个活动的 session/persistence 上下文,但您的实体未附加到该持久性上下文。
问题是 merge
returns 一个附加实例,但您使用的不是那个附加实例,而是您开始使用的分离实例。
只需替换
entityManager.merge(product);
与
product = entityManager.merge(product);
你的代码应该可以工作。
另请参阅 https://vladmihalcea.com/jpa-persist-and-merge/ and https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#merge-T-