【问题标题】:toString() method loads lazy fields in HibernatetoString() 方法在 Hibernate 中加载惰性字段
【发布时间】:2018-09-28 11:10:39
【问题描述】:

休眠。我有一堂懒惰的课。我从 db 获取一个实体而不加载它,但是当我使用 entity.toString() 时,这个字段由 JPA 加载。如何避免这种行为?如果字段为空,我只想获得空值。

【问题讨论】:

  • toString() 是否访问该字段?
  • 是的。如果字段为空,我想获得空值。
  • String.valueOf(field) 会给你null
  • 我的意思是从没有惰性字段的 db 加载实体后,我想使用 entity.toString() 并获取 null。但是 jpa 正在加载它。我知道这是默认行为。但我想避免它。
  • 'jpa' 不做任何事情;您的 jpa 提供商会,哪一个?并且仅当对象仍处于“托管”状态时。

标签: java jpa lazy-loading


【解决方案1】:

如果您使用的是 Hibernate,您可以检查该字段是否未初始化:

Hibernate.isInitialized(myproperty)

在你的 toString() 实现中使用这个方法。

【讨论】:

  • 当然,但是 > 70% 正在使用 Hibernate,所以我认为这也可能是这种情况。
  • 对。我正在使用休眠。这正是我想要的。非常感谢。最后一个问题。您如何看待,在 entity.toString() 方法中使用 Hibernate.isInitialized(myproperty) 是否正常?
  • 没有。您的案例在未初始化时显示 null 是错误信息。您应该记录“未初始化”之类的内容,因为 null 表示未设置属性(例如数据库中的 null)
  • 对不起,我不是很清楚。当您说“不”时,您的意思是最好不要在 entity.toString() 中使用它?或者你的意思是这很正常,但我应该只记录“未初始化”而不是 null?
  • 两者。为什么需要 toString()?
【解决方案2】:

我认为这是因为您重新定义了 toString () 方法并包含了惰性字段。我有过如此令人震惊的历史。您需要重新定义没有这些字段的 toString() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多