java - 为什么@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())
。什么问题?
解决方案
推荐阅读
- cloud-foundry - Cloud Foundry 通过 curl 为一个应用提供超过 10 个端口
- mysql - 向具有常量值的 sql 查询结果添加额外的列
- python - 基于两个数据框的列的条件平均值
- vue.js - VueJS 多个入口点
- python - Python 中测试方法名称的约定
- docker - 将多个主机目录绑定到同一个容器路径
- node.js - EdgeJS 在没有伴随 Await 的情况下进行异步调用
- c++ - 为什么我会出现比赛条件?
- android - ViewHolder 在 RecycleView 适配器中使用时获取自定义视图的空引用
- python - Python为文件名提供FileNotFoundError