【问题标题】:Is it ok to pass interface of DTO to DAO可以将DTO的接口传递给DAO吗
【发布时间】:2015-02-09 05:06:11
【问题描述】:

这是关于将DTO的接口传递给DAO。

例如我有以下代码

public interface User {
  String getName();
}

public class SimpleUser implements User {
  protected String name;

  public SimpleUser(String name) {
    this.name = name;
  }

  @Override
  public String getName() {
    return name;
  }    
}

// Mapped by Hibernate
public class PersistentUser extends SimpleUser {

  private Long id;

  // Constructor

  // Getters for id and name

  // Setters for id and name
}

我正在使用通用 DAO。如果我使用界面 User 而不是 PersistentUser 创建 DAO 可以吗?

User user = new PersistentUser(name);
UserDao.create(user);

我在堆栈上阅读了很多主题,但没有弄清楚这种方法是否可行。请帮我。也许这很愚蠢,我只能解决问题。

关于分离豆子。 我这样做是因为我想通过 API 模块共享一些类,这些类可以在外部用于创建实体并将它们传递给我的应用程序。因为它们使用我开发的接口,所以我可以将它们传递给我的 DAO 进行持久化。

【问题讨论】:

  • 为什么将 DTO 用作接口而不是直接类?
  • 因为当我想以最小的更改存储外部实体时,它会很有用。例如,某人可以拥有自己的用户实现,并且只传递给我的接口。
  • 我仍然不明白你的确切目的。编程的一个原则是 YAGNI:你不需要它。如果您不确定这是否有用,或者它是否可以支持未计划且可能还没有必要实施的未来更改,请不要这样做。再说一次,我仍然不明白您将接口用作 DTO。使用 DTO 的直接类在您的层之间进行基本通信,对特定情况使用接口(我目前在您的问题描述中找不到)。
  • 好吧,也许你是对的。如果我想隐藏从 DAO 返回的实体的 setter 方法呢?
  • 如果你不打算在 DAO 调用者中使用 setter,那么就不要在那里调用它们。我仍然没有找到为 getter 创建接口的好点。

标签: java hibernate dao dto


【解决方案1】:

总的来说,我会说没问题,但有一些隐藏的问题。开发人员可以将对象向下转换或通过不应访问的 toString 方法访问某些状态。如果您不小心,可能会发生在不应序列化的 Web 服务中将状态序列化为 JSON/XML 的情况。名单还在继续。

我为那个用例创建了Blaze-Persistence Entity Views。您基本上将 JPA 实体的 DTO 定义为接口并将它们应用于查询。它支持映射嵌套 DTO、集合等,基本上是您所期望的一切,最重要的是,它会提高您的查询性能,因为它会生成查询,只获取 DTO 实际需要的数据。

您示例的实体视图可能如下所示

@EntityView(PersistentUser.class)
interface User {
  String getName();
}

查询可能如下所示

List<User> dtos = entityViewManager.applySetting(
  EntityViewSetting.create(User.class),
  criteriaBuilderFactory.create(em, PersistentUser.class)
).getResultList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2014-06-08
    相关资源
    最近更新 更多