Hibernate - OneToMany Relation

时间:2016-10-25 06:22:29

标签: hibernate

我们是否应该在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;
    }
}

1 个答案:

答案 0 :(得分:1)

正如您所料,答案是“它取决于”。肯定会出现这种情况,您可能需要在逻辑中依赖toString(),这需要包含关系。

但是,在大多数情况下,包括这些属性会导致问题。 toString()通常用于不同的诊断情况(例如,在日志记录,调试期间等),包括关系可能会遇到以下问题:

  1. 如果在事务边界外调用toString(),则会抛出运行时异常,因为没有会话(在Hibernate的术语中)用于延迟提取。

  2. 鉴于实体通常在关系中相互关联,这可能形成一个巨大的对象图,如果你盲目地在你的toString()中包含关系,你将会得到大量的数据,这可能会导致很多问题。

  3. 我的个人经历是,我只会包含密切相关的关系。如果我不确定是否真的需要,我宁愿排除这种关系。保留toString()仅用于诊断目的,如果在业务逻辑中需要字符串表示,请考虑为此目的声明新方法和接口。