Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将DTO的接口传递给DAO可以吗_Java_Hibernate_Dao_Dto - Fatal编程技术网

Java 将DTO的接口传递给DAO可以吗

Java 将DTO的接口传递给DAO可以吗,java,hibernate,dao,dto,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() {

它是关于将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。如果我使用interface User而不是PersistentUser创建DAO,可以吗

User user = new PersistentUser(name);
UserDao.create(user);
我读了很多关于stack的主题,但没有弄明白这个方法是正确的还是错误的。请帮助我。也许这很愚蠢,我只能解决问题

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

一般来说,我会说这是可以的,但是有一些隐藏的问题。开发人员可以通过一个不应该被访问的toString方法来关闭对象或访问某些状态。如果您不小心,可能会发生这种情况,即状态在不应序列化的Web服务中被序列化为JSON/XML。这个名单还有很多

我就是为这个用例创建的。实际上,您将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();
查询可能是这样的

@EntityView(PersistentUser.class)
interface User {
  String getName();
}
List<User> dtos = entityViewManager.applySetting(
  EntityViewSetting.create(User.class),
  criteriaBuilderFactory.create(em, PersistentUser.class)
).getResultList();
List dtos=entityViewManager.applySetting(
EntityViewSetting.create(User.class),
create(em,PersistentUser.class)
).getResultList();

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