这是关于将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以便持久化。
答案 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();