运行 事务中的惰性集合仍在返回 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-