Java JPA实体、循环引用和toString()

Java JPA实体、循环引用和toString(),java,jpa,Java,Jpa,通常会有实体图,其中关系以两种方式映射,例如 class Home { @Id private Long id; @OneToMany(mappedBy = "home") Set<Room> rooms; @Override public String toString() { return "Home [id=" + id + ", rooms=" + rooms + "]"; } } class Room { @Id priva

通常会有实体图,其中关系以两种方式映射,例如

class Home {
  @Id
  private Long id;

  @OneToMany(mappedBy = "home")
  Set<Room> rooms;

  @Override
  public String toString() {
    return "Home [id=" + id + ", rooms=" + rooms + "]";
  }
}

class Room {
  @Id
  private Long id;

  @ManyToOne
  private Home home;

  @Override
  public String toString() {
    return "Room [id=" + id + ", home=" + home + "]";
  }
}
班级主页{
@身份证
私人长id;
@OneToMany(mappedBy=“home”)
设置房间;
@凌驾
公共字符串toString(){
返回“Home[id=“+id+”,rooms=“+rooms+”]”;
}
}
教室{
@身份证
私人长id;
@许多酮
私人住宅;
@凌驾
公共字符串toString(){
return“Room[id=“+id+”,home=“+home+”]”;
}
}
因此,如果我们使用IDE的自动功能生成toString方法,我们可能会在无意中导致toString()方法中出现深度递归,因为Home将打印房间,而每个房间将依次打印其Home


有没有一种优雅的方法(特别是为了调试目的)可以以一种清晰、类似于toString的方式打印对象的图形,而不必在实现toString()方法时注意以避免循环?

使用Apache Commons Lang执行以下操作如何

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}


这将为您提供对象的反射表示。通过这种方式,您可以实现一个格式化程序,它将遍历对象图并漂亮地打印输出,但不必担心管理单个属性的添加/删除。

只需打印
home.id
,而不是整个home。不加注意地做任何事情通常是个坏主意。一定要注意。在toString()方法中浏览关联通常不是一个好主意,因为一旦关联延迟且实体分离,就会导致异常。是的,但这并不能解决与toString方法对象中的循环引用相关的问题!