java - 将DTO的接口(interface)传递给DAO可以吗

标签 java hibernate dao dto

这是关于将 DTO 的接口(interface)传递给 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 接口(interface)而不是 PersistentUser 创建 DAO 可以吗?

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

我阅读了很多有关堆栈的主题,但不知道这种方法是否可行。请帮我。也许这很愚蠢,我只能解决问题。

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

最佳答案

一般来说,我会说没问题,但是有一些隐藏的问题。开发人员可以通过 toString 方法强制转换对象或访问某些不应访问的状态。如果您不小心,状态可能会在不应序列化的 Web 服务中序列化为 JSON/XML。这样的例子不胜枚举。

我创建了Blaze-Persistence Entity Views正是针对该用例。您本质上将 JPA 实体的 DTO 定义为接口(interface)并将它们应用于查询。它支持映射嵌套 DTO、集合等,基本上是您期望的所有内容,最重要的是,它将提高您的查询性能,因为它将生成仅获取 DTO 实际需要的数据的查询。

您的示例的实体 View 可能如下所示

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

查询可能如下所示

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

关于java - 将DTO的接口(interface)传递给DAO可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410581/

相关文章:

java - 当 Android Activity 失去焦点时,如何隐藏或显示布局元素?

java - 缓冲字符串到数组列表,并拆分

Java JNIEnv 段错误

java - 玩!没有正确关闭 H2

java - 如何根据属性区分 Hibernate 中的两个查询?

testing - 是否对 DAO 层进行单元测试?

java - 如何在 "::"方法引用运算符附近的 Java Stream API 中进行额外处理

java - 使用 hibernate 和 spring 将持久对象的字符串集合加载到模型中

java - 是否可以在不使用反射的情况下用 Java 编写一个简单的通用 DAO?

unit-testing - DAO 单元测试