【问题标题】:Why entity manager returns me object with null values?为什么实体管理器返回空值的对象?
【发布时间】:2015-04-22 05:07:29
【问题描述】:

我有spring控制器,它调用服务层,它调用Fao层。

1) 我使用 EntityManager-s find() 方法获取用户对象。它很好地检索数据。

2) 每个用户与 School Object 有一对多的关系。

@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 客户端中运行此查询时,我得到了真实且正确的数据!

4) 但是当我从用户实体上学时:

School s=user.getSchool() 

它返回 School 对象,但它的所有值都为 null。

为什么值是空的?我糊涂了。在日志中,一切都很好。 Hibenate 也记录了我正确的查询!此查询返回数据,但使用实体管理器的值为空。我能做什么?

如果我将 LAZY 更改为 EAGER,一切正常!但我不喜欢那样 OF 如果我 merge() 存在学校实体,它会检索数据。我不明白为什么?

【问题讨论】:

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


    【解决方案1】:

    因为你定义了FetchType.LAZY为学校栏目取值;看看 FetchType.LAZYFetchType.EAGERHERE 的区别。如果你想获得不为空的学校对象,有两种选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      相关资源
      最近更新 更多