如果我使用像JPA2这样的ORM - 我的实体映射到我的数据库,我还应该使用DAO吗?这似乎是一个更多的开销.
例如,我需要维护三个额外的包:
一个指定我的域对象(几乎映射我的Entity对象):
public class Employee {
private String firstName;
private String lastName;
...
// Getters and setters
}
Run Code Online (Sandbox Code Playgroud)一个包含指定我的DAO方法的接口
public interface EmployeeDAO {
public void addEmployee(Employee employee);
public Employee getEmployeeById(long id);
...
}
Run Code Online (Sandbox Code Playgroud)一个包含实现我的DAO的会话bean
public EmployeeJpaDAO implements EmployeeDAO {
interface method implementations here
....
private method that transform my Employee entity into my Employee domain object
}
Run Code Online (Sandbox Code Playgroud)现在,每次我需要执行新的CRUD操作时,需要添加许多额外的行李.
但是,从DAO中看到的好处是:
您可以使用DAO的内存实现来对服务层进行单元测试.这意味着您不需要访问数据库来测试业务逻辑,并且可以确保您的对象始终包含属性的相同值
它将业务逻辑与数据库访问逻辑分开
不涉及实现DAO的选项是在服务层中使用实体对象和EntityManager:
@Stateless
public class EmployeeEjb {
@PersistenceContext(unitName = "employee")
private EntityManager manager;
public Employee getEmployeeById(long id) …Run Code Online (Sandbox Code Playgroud) 在我之前的问题,DAO和服务层(JPA/Hibernate + Spring)之后,我决定在使用JPA/Hibernate,Spring和Wicket的应用程序中仅使用一个DAO作为我的数据层(至少在开始时).提出了使用通用CRUD方法,但我不太确定如何使用JPA实现它.你能给我一个例子或分享一个关于这个的链接吗?
我试图在Java中使用接口,抽象类和泛型构建一个相当复杂的结构.由于没有仿制药的经验,只有平均创建优质OOP设计的经验,这开始证明是一项挑战.
我有一种感觉,我正在尝试做的事情实际上无法完成,但我可以接近它.我会尽量简短地解释一下.我只想告诉我这个结构将代表我的DAO和服务层来访问数据库.使这个问题更抽象只会使它变得更加困难.
我的DAO层完全没有问题.有一个通用的DAO接口,每个实体都有一个DAO接口,它扩展了泛型接口并填充了泛型类型.然后是每个DAO实现扩展的抽象类,它实现相应的接口.最有可能令人困惑的阅读,所以这里是以产品的DAO为例的图表:

现在,对于服务类,我有一个类似的结构.无论如何,服务类中的大多数方法都映射到DAO方法.如果您使用"服务"替换上图中的每个"DAO",您将获得我的服务层的基础.但根据我的以下想法,有一件事我想做:
实体的每个服务类至少会访问一个DAO对象,即它所针对的实体的DAO.
哪个是......
如果我能够进行适当的OO设计,使每个服务类为其各自实体的DAO对象都有一个实例变量,那么在我看来,我的服务层将是完美的.对我的建议是受欢迎的,以防我的设计看起来不那么好.
我已经像这样实现了它:
public abstract class AbstractService<EntityDAO> {
EntityDAO entityDAO;
public AbstractService() {
entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor
}
abstract EntityDAO makeEntityDAO();
}
Run Code Online (Sandbox Code Playgroud)
public class ProductServiceImpl extends AbstractService<ProductDAOImpl> {
public ProductServiceImpl() {
super();
}
@Override
ProductDAOImpl makeEntityDAO() {
return new ProductDAOImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
这个设计的问题是我不喜欢的编译器警告:它在构造函数中有一个可覆盖的方法调用(请参阅注释).现在它被设计为可覆盖的,实际上我强制执行它以确保每个服务类都具有对相应DAO的引用.这是我能做的最好的事情吗?
我尽我所能地包括你可能需要的一切,只包括你对这个问题的需求.我现在要说的是,欢迎提出意见和更广泛的答案,感谢您花时间阅读.
java ×3
dao ×2
architecture ×1
crud ×1
genericdao ×1
generics ×1
java-ee ×1
jpa ×1
jpa-2.0 ×1
oop ×1