我们正在使用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
}
答案 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);
}
}