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