在延迟加载的列表上调用size()时,无法懒惰地初始化集合

时间:2016-12-27 22:00:41

标签: java database hibernate spring-data spring-data-jpa

我们正在使用spring-data jpa和hibernate实现。

我有一个包含子项列表的父实体。获取类型是懒惰的。当我在服务类中调用find方法时。我得到了父对象,但在子列表上执行size()给了我惰性异常:

failed to lazily initialize a collection of role: could not initialize proxy - no Session

我不能在延迟加载的列表上执行size(),因为我的find方法上有@Transacitonal注释吗?

    @Entity
    @Table(name="PARENT")
    public class Parent implements Serializable{

    @OneToMany(targetEntity = Child.class, cascade=CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name="pk", insertable=false, updatable=false, nullable=false)
    private List<Child> children;

 }


    @Entity
    @Table(name="CHILD")
    public class Child implements Serializable {
    private static final long serialVersionUID = -3574595532165407670L;

    @Id
    @Column(name = "pk")
    @SequenceGenerator(name="childPK_GENERATOR", sequenceName="childseq")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="childPK_GENERATOR")
    private Long pk;
 }

服务类:

@Transactional
     public Parent find(Lond id){
        Parent parent = parentRepository.findOne(id)
        parent.getChildren.size(); //throws lazy load exception
     }

1 个答案:

答案 0 :(得分:1)

@Transactional仅在您已配置 Spring事务管理器时才会在事务中包装您的方法调用。

假设您已使用java配置文件配置JPA。

@Import(TransactionConfig.class)
public class JpaConfig {
// your EntityManagerFactory configs...
}

然后你应该配置事务管理器

@Configuration
@EnableTransactionManagement
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }
}