【问题标题】:Hibernate gets null for entity instance variables?Hibernate 为实体实例变量获取空值?
【发布时间】:2010-12-05 07:21:13
【问题描述】:

我正在尝试实现一个功能,需要表单为登录用户加载数据。所以我编写了一个查询来获取此用户 ID 的这些数据,这是来自学校实体类的代码 sn-p:

public class ShSchool implements java.io.Serializable {
     private long schoolId;
     private GsDistrict gsDistrict;
}

我尝试使用以下查询获取数据:

session.createQuery("from ShSchool where schoolId="+schoolId).list();

问题是我获得了原始实例变量的值,而其他任何数据类型(例如 GsDistrict)都获得了 null,那么出了什么问题,我如何才能获得这些对象的值?

谢谢

【问题讨论】:

  • 是的,我认为它是延迟加载的
  • 我正在尝试访问它的值并获得 null

标签: java hibernate


【解决方案1】:

可能的原因:

  • 对于该特定用户,gsDistrict 确实为 null,请检查 DB 以确保它不是。
  • Hibernate 映射不正确。
  • gsDistrict 是延迟加载的,您在 Hibernate 会话之外访问它。但是,在这种情况下,我希望会引发异常。

请包括 Hibernate 映射,问题可能就在那里。

【讨论】:

  • 谢谢 octav 我想我是在休眠会话之外访问它。我认为如果我更改延迟加载可以解决,有什么可能的解决方案吗?
  • 嗯,根据我的阅读,多对一关系的延迟加载在 Hibernate 中并不容易实现。另外,假设它是延迟加载导致的,gsDistrict 不应该为空,它应该是一个代理。因此,由于您看到该属性为空(如您所说),我认为这是其他原因。请检查其他 2 个替代方案。发布映射会有所帮助! :)
  • NamedEntityGraphs 可以避免延迟加载。例如,请参阅此处thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity 您可以定义哪些集合或列表通常应该是惰性的,但在特定情况下通过使用存储库调用急切加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2011-06-06
  • 2014-10-29
  • 1970-01-01
相关资源
最近更新 更多