我对 Hibernate 比较陌生,并且正在尝试了解设计 DAO 的最佳架构方法。最初,我创建了一组域(实体)对象并编写了一个 DAO 接口和实现来访问它们。为了降低使用集合中的实体的风险,我编写了不使用主键的 equals() 和 hashCode() 方法。但我发现这既麻烦又低效。然后我决定通过将域对象的使用限制在 DAO 中并使用 DTO 发送到 DAO/从 DAO 中检索来消除这个问题。让我印象深刻的是,另一个好处是从表结构中发送/检索的数据的抽象和解耦。
但是,如果一开始不使用实体对象,那么使用 Hibernate 可能会很麻烦。例如,在 @OneToMany 关系中写入依赖对象列表的 DAO 方法不能再传递父端实体的实例,因为虽然使用 DAO 的代码可能具有父级的 id,但它没有父级要通过的实体。该关系必须被删除或单向,或者 DAO 必须检索父级以获取实体引用。
一个较早的回复将 DTO 标记为反模式。我明白为什么了。但是随着实体类的广泛使用,我提到的 Hibernate 身份字段的问题是否会变得有问题和潜在危险?另外,从表结构中抽象出返回的数据,比如解耦,难道没有其他好处吗?如果返回复杂的数据集,无论如何都可能需要 DTO,为什么不 100% 使用它们并获得我提到的优势呢?