首页 > 解决方案 > 为什么@Transactional 会发生lazyInitializationException?

问题描述

我必须实体如下:

public class FeatureType {
   @Id Sring id;
   ...
   @OneToMany(mappedBy="featureType", fetch=FetchType.LAZY)
   List<Metadata> entities = new ArrayList();
}

public class Metadata{
   ...
   @ManyToOne
   FeatureType featureType;
}

现在,featureType存储库如下:

@Repository
public interface FeatureTypeRepository extends JpaRepository<FeatureType, String> 
{}

我创建了一个字符串到 FeatureType 转换器,如下所示:

class StringToFeatureType implement Converter<String, FeatureType>
{
   private FeatureTypeRepsitory rep;
   public StringToFeatureType(FeatureTypeRepsitory rep){this.rep = rep;}
   @Override
   public FeatureType convert(String name)
   {
       return rep.findByIdOrNull(name);
   }
}

我在控制器中遇到问题:

@RestController
public FeatureTypeController()
{
   @Transactional
   @GetMapping("/featureType-{featureType}/metadata")
   List<Metadata> getMetadata(FeatureType featureType)
   {
      system.out.println(entityManager.contains(featureType));//print false
      system.out.println(featureType.getMetadata().size());//Occur Error here
      return featureType.getMetadata();
   }
}

我已经打开了事务,但是当程序接收到行时system.out.println(featureType.getMetadata().size());,出现异常如下:

org.hibernate.LazyInitializationException:无法延迟初始化角色集合:fava.FeatureType.metadata,无法初始化代理 - 没有会话

我知道如果 featureType 有一些元数据,问题发生在序列化错误,但在 line 出现错误system.out.println(featureType.getMetadata().size())。什么问题?

标签: javaspringhibernatespring-boot

解决方案


推荐阅读