可以将DTO的接口传递给DAO吗
Posted
技术标签:
【中文标题】可以将DTO的接口传递给DAO吗【英文标题】:Is it ok to pass interface of DTO to 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 创建接口的好点。 【参考方案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();
【讨论】:
以上是关于可以将DTO的接口传递给DAO吗的主要内容,如果未能解决你的问题,请参考以下文章