我们是否应该在Hibernate模型类的toString()
方法中输入属性的条目,如果它是延迟加载的并且在OneToMany关系中使用?
class Employee {
private Set<IiopUrl.Address> addressDetailsSet;
//getters and setters
@OneToMany(cascade = {CascadeType.ALL})
@LazyCollection(LazyCollectionOption.TRUE)
@JoinTable(name = "Employee_Address_Map",
joinColumns = {@JoinColumn(name = "Employee_ID", referencedColumnName = "INNER_ID")},
inverseJoinColumns = {@JoinColumn(name = "Address_Id", referencedColumnName = "INNER_ID")},
uniqueConstraints = @UniqueConstraint(columnNames = {"Employee_ID", Address_Id}))
public Set<IiopUrl.Address> getAddressDetailsSet() {
return addressDetailsSet;
}
}
答案 0 :(得分:1)
正如您所料,答案是“它取决于”。肯定会出现这种情况,您可能需要在逻辑中依赖toString()
,这需要包含关系。
但是,在大多数情况下,包括这些属性会导致问题。 toString()
通常用于不同的诊断情况(例如,在日志记录,调试期间等),包括关系可能会遇到以下问题:
如果在事务边界外调用toString()
,则会抛出运行时异常,因为没有会话(在Hibernate的术语中)用于延迟提取。
鉴于实体通常在关系中相互关联,这可能形成一个巨大的对象图,如果你盲目地在你的toString()
中包含关系,你将会得到大量的数据,这可能会导致很多问题。
我的个人经历是,我只会包含密切相关的关系。如果我不确定是否真的需要,我宁愿排除这种关系。保留toString()
仅用于诊断目的,如果在业务逻辑中需要字符串表示,请考虑为此目的声明新方法和接口。