如何在使用HibernateMap的类中实现toString()?

des4xlb0  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(167)

我有一个从休眠会话中获得的类的示例。那次会议早就过去了。现在,我正在调用toString(),我得到了预期的LazyInitializationException: could not initialize proxy - no Session,因为我正在尝试访问Hibernate在示例加载(惰性加载)过程中未解析的引用。
我真的不想让加载变得急切,因为它会将查询从大约120个字符更改为超过4KB(具有8个连接)。而且我不必这样做:我希望在toString()中显示的只是被引用对象的ID;也就是说,在这个时间点上Hibernate需要知道的东西(否则它不能执行延迟加载)。
所以我的问题是:你是如何处理这起案件的?永远不要尝试在toString()中使用引用?还是在加载代码中调用toString()以防万一?或者,Hibernate中有没有一些实用函数,当我传递给它一个可能是惰性的引用时,它会返回一些有用的东西?或者,您是否完全避免在toString()中引用?

hmtdttj4

hmtdttj41#

可以通过将ID字段的accesstype设置为“Property”来实现这一点。比如:

@Entity
public class Foo {
    // the id field is set to be property accessed
    @Id @GeneratedValue @AccessType("property")
    private long id;
    // other fields can use the field access type
    @Column private String stuff;
    public long getId() { return id; }
    public void setId(long id) { this.id = id; }
    String getStuff() { return stuff; }
    // NOTE: we don't need a setStuff method
}

它解释了here。这样,在创建代理时,始终填充id字段。

fgw7neuy

fgw7neuy2#

我找到了一种解决方法:

public static String getId (DBObject dbo)
{
    if (dbo == null)
        return "null";

    if (dbo instanceof HibernateProxy)
    {
        HibernateProxy proxy = (HibernateProxy)dbo;
        LazyInitializer li = proxy.getHibernateLazyInitializer();
        return li.getIdentifier ().toString ();
    }

    try
    {
        return Long.toString (dbo.id ());
    }
    catch (RuntimeException e)
    {
        return "???";
    }
}

所以这段代码所做的就是从对象中获取ID(一个64位数字)。DBObject是定义long id()的接口。如果对象是Hibernate代理,那么我与它的LazyInitializer对话以获取ID。否则,我调用id()。用途:

class Parent {
    DBObject child;
    public String toString () {
        return "Parent (id=..., child=" + getId(child)+")");
    }
}
jhkqcmku

jhkqcmku3#

我发现最符合良好实践的方法是对本博客上的解决方案进行修改:http://www.nonfunc.com/2016/02/05/jpa-performance-gotcha-tostring-really/。它需要对可为空的字段和集合对象进行修改。

public toString() {
  return String.format("FuBar [id=%d" +  
      + ", fu=%s" // fu is a lazy non-nullable field
      + ", bar=%s" // bar is a nullable lazy field
      + ", borks=%s]", // borks is a lazy collection of Bork objects
      id,
      fu instanceof HibernateProxy ? "[null]" : fu.toString(),
      bar == null || bar instanceof HibernateProxy ? "[null]" : bar.toString(),
      borks instanceof PersistentSet ? "[null]" : borks.toString());
}
0pizxfdo

0pizxfdo4#

如果您想要返回的只是对象的ID,我设想调用getID(),然后在您想要显示它的时刻将int/long解析为字符串值就可以了。至少根据这个问题看起来是这样的。

  • 编辑*

How to solve the LazyInitializationException using JPA and Hibernate
在查看了评论并进行了一些搜索之后,我相信这可能对您的场景最有利。

相关问题