为什么实体管理器 returns 我反对空值?
Why entity manager returns me object with null values?
我有spring控制器,它调用服务层,它调用Fao层。
1) 我使用 EntityManager 的 find() 方法获取用户对象。它检索数据非常好。
2) 每个用户与学校对象有一对多的关系。
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name="SCHOOL_ID", foreignKey = @ForeignKey(name = "FK_USER_SHCOOL"))
private School school;
3) 当我从用户实体对象上学时,休眠记录我 SQL 查询。
select school0_.id as id1_7_0_, school0_.ADDRESS as ADDRESS2_7_0_, school0_.CITY as CITY3_7_0_,
school0_.DESCRIPTION as DESCRIPT4_7_0_, school0_.EMAIL as EMAIL5_7_0_, school0_.NAME as NAME6_7_0_,
school0_.version as version7_7_0_ from SCHOOL school0_ where school0_.id=2
当我在 SQL 客户端中 运行 这个查询时,我得到了真实正确的数据!
4) 但是 当我从用户实体上学时:
School s=user.getSchool()
它 returns School 对象,但它的所有值为空。
为什么值为空?我很困惑。在日志中,一切都很好。 Hibenate 也记录我正确的查询!此查询 returns 数据,但使用实体管理器值为空。我能做什么?
如果我把懒惰改成急切,一切都会好起来的!但我不喜欢那样
OF 如果我 merge() 存在学校实体,它会检索数据。我不明白为什么?
因为您定义了 FetchType.LAZY
获取学校列;看看 FetchType.LAZY
和 FetchType.EAGER
与 HERE 的区别。如果你想得到非空的学校对象,有两个选项:
- 将
FetchType.LAZY
更改为FetchType.EAGER
- 当您的用户对象在
@Transaction
注释方法中持久调用 user.getSchool()
时。
我有spring控制器,它调用服务层,它调用Fao层。
1) 我使用 EntityManager 的 find() 方法获取用户对象。它检索数据非常好。
2) 每个用户与学校对象有一对多的关系。
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name="SCHOOL_ID", foreignKey = @ForeignKey(name = "FK_USER_SHCOOL"))
private School school;
3) 当我从用户实体对象上学时,休眠记录我 SQL 查询。
select school0_.id as id1_7_0_, school0_.ADDRESS as ADDRESS2_7_0_, school0_.CITY as CITY3_7_0_,
school0_.DESCRIPTION as DESCRIPT4_7_0_, school0_.EMAIL as EMAIL5_7_0_, school0_.NAME as NAME6_7_0_,
school0_.version as version7_7_0_ from SCHOOL school0_ where school0_.id=2
当我在 SQL 客户端中 运行 这个查询时,我得到了真实正确的数据!
4) 但是 当我从用户实体上学时:
School s=user.getSchool()
它 returns School 对象,但它的所有值为空。
为什么值为空?我很困惑。在日志中,一切都很好。 Hibenate 也记录我正确的查询!此查询 returns 数据,但使用实体管理器值为空。我能做什么?
如果我把懒惰改成急切,一切都会好起来的!但我不喜欢那样 OF 如果我 merge() 存在学校实体,它会检索数据。我不明白为什么?
因为您定义了 FetchType.LAZY
获取学校列;看看 FetchType.LAZY
和 FetchType.EAGER
与 HERE 的区别。如果你想得到非空的学校对象,有两个选项:
- 将
FetchType.LAZY
更改为FetchType.EAGER
- 当您的用户对象在
@Transaction
注释方法中持久调用user.getSchool()
时。