为什么实体管理器返回具有空值的对象?

时间:2015-02-20 13:40:56

标签: hibernate jpa jpa-2.0 hibernate-4.x

我有弹簧控制器,它调用服务层,它调用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如果我合并()现有的学校实体,它会检索数据。我不明白为什么?

1 个答案:

答案 0 :(得分:2)

因为您定义了FetchType.LAZY获取学校专栏;看看与HEREFetchType.LAZYFetchType.EAGER差异。如果你想得到null学校对象,有2个选项:

  1. FetchType.LAZY更改为FetchType.EAGER
  2. 当您的用户对象user.getSchool()注释方法内的持久性调用@Transaction时。