是否可以将DTO的界面传递给DAO

时间:2014-12-10 20:51:39

标签: java hibernate dao dto

这是关于将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);

我在堆栈上阅读了很多主题,但没想到这种方法是好还是不行。请帮我。也许这是愚蠢的,我只能解决问题。

关于分离bean。 我这样做是因为我想通过API模块分享一些类,可以在外面使用它来创建实体并将它们传递给我的应用程序。因为他们使用我开发的界面所以我可以将它们传递给我的DAO以便持久化。

1 个答案:

答案 0 :(得分:0)

通常,我会说没问题,但是有一些隐藏的问题。开发人员可以放弃该对象或通过不应该访问的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();