我有弹簧控制器,它调用服务层,它调用Fao层。
1)我使用EntityManager-s find()方法获取User对象。它可以很好地检索数据。
2)每个用户与学校对象有一对多的关系。
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name="SCHOOL_ID", foreignKey = @ForeignKey(name = "FK_USER_SHCOOL"))
private School school;
3)当我从用户实体对象上学时,hibernate会记录我的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 Client中运行此查询时,我得到了正确的数据!
4)但当我从用户entyty上学时:
School s=user.getSchool()
它返回School对象,但它的所有值都为null。
为什么值为空?我糊涂了。在日志中,一切都很顺利。 Hibenate也记录了我正确的查询!此查询返回数据,但使用实体管理器值为null。我该怎么办?
如果我将LAZY改为EAGER,那么一切正常!但我不喜欢 OF如果我合并()现有的学校实体,它会检索数据。我不明白为什么?
答案 0 :(得分:2)
因为您定义了FetchType.LAZY
获取学校专栏;看看与HERE的FetchType.LAZY
和FetchType.EAGER
差异。如果你想得到null学校对象,有2个选项:
FetchType.LAZY
更改为FetchType.EAGER
user.getSchool()
注释方法内的持久性调用@Transaction
时。