你应该把它@Transactional放在DAO类和/或它们的方法中,还是更好地注释使用DAO对象调用的Service类?或者注释两个"层"是否有意义?
我正在浏览一份文件而且我遇到了一个叫做的术语DAO.我发现它是一个数据访问对象.有人可以解释一下这究竟是什么吗?
我知道它是某种用于访问来自不同类型数据源的数据的接口,在我的这个小小的研究中,我碰到了一个名为数据源或数据源对象的概念,事情在我的脑海中搞砸了.
我真的想知道DAO在使用它的位置方面是什么.如何使用?任何从非常基本的东西解释这个概念的页面的链接也是值得赞赏的.
我正在尝试使用org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy我的Spring项目,但我不确定如何使用它或者它是否正是我正在寻找的.我意识到它可以帮助我的DAO使用简单的JDO PersistenceManagerFactory.另一个问题是:如果代理没有正确完成会发生什么?我还可以使用它来访问我的工厂来创建一个事务感知持久性管理器吗?如果工厂管理的对象是单例,这会改变吗?为什么不直接访问PersistenceManagerFactory?也许PersistenceManagerFactoryUtils.getPersistenceManager更适合我的需求?可以getObject返回null吗?
我正在努力提高我的设计模式技巧,我很好奇这些模式之间有什么区别?所有这些看起来都是一样的 - 封装了特定实体的数据库逻辑,因此调用代码不了解底层持久层.从我的简短研究中,他们通常都会实现您的标准CRUD方法并抽象出特定于数据库的详细信息.
除了命名约定(例如CustomerMapper与CustomerDAO vs. CustomerGateway vs. CustomerRepository)之外,有什么区别?如果存在差异,您何时会选择一个而不是另一个?
在过去,我会编写类似于以下的代码(简化,自然 - 我通常不会使用公共属性):
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
Run Code Online (Sandbox Code Playgroud)
并有一个CustomerGateway类为所有方法实现特定的数据库逻辑.有时我不会使用接口并使CustomerGateway上的所有方法都是静态的(我知道,我知道,这使得它不太可测试)所以我可以这样称呼它:
Customer cust = CustomerGateway.GetCustomerByID(42);
Run Code Online (Sandbox Code Playgroud)
这似乎与Data Mapper和Repository模式的原理相同; DAO模式(与Gateway相同,我认为?)似乎也鼓励特定于数据库的网关.
我错过了什么吗?有3-4种不同的方式做同样的事情似乎有点奇怪.
在DAO中包含一个字段通常很有用,其值来自Java枚举.典型示例是登录DAO,其中您通常具有将用户表征为"NORMAL"或"ADMIN"的字段.在Hibernate中,我将使用以下2个对象以(半)类型安全的方式表示这种关系:
class User {
String username;
String passwd;
UserType type;
}
class UserType {
private enum Type {ADMIN, NORMAL};
private String type;
//Setters/Getters for Hibernate
public void setType(String type);
public String getType();
//Setters/Getters for user
public void setUserType(UserType.Type t);
public UserType.Type getUserType();
public static UserType fromType(UserType.Type t);
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是我发现了UserType类,并且需要太多的官僚作风来存储一些值.理想情况下,Hibernate应该直接支持枚举字段,并创建一个额外的表来存储枚举值.
我的问题是:有没有办法在Hibernate中直接映射枚举类?如果没有,我表示枚举的模式是否足够好还是我错过了什么?人们使用了哪些其他模式?
首先,我可能会问一些之前被问过和回答的问题,但我无法获得搜索结果.好的一般(或总是到目前为止:))我们通常在服务层上定义事务注释典型的spring hibernate crud
控制器 - >经理 - >道 - >奥姆.
我现在有一种情况需要在基于客户端站点的域模型之间进行选择.假设客户端A使用我的域模型一切都很好但是其他客户端站点会给我一个Web服务而不是使用我们的域模型.
我应该替换哪一层.我相信它必须是Dao,它将从Web服务中获取数据并将其发送回来.两个单独编写的Dao图层并根据场景插入.
我现在已经意识到,当我们在服务层中放置@Transactional时,我们一直在进行紧耦合(如果有这样的事情或说没有松耦合).这么多大脑不会错,或者是他们(我对此表示怀疑).
所以问题是"应该在哪里"@Transactional"放置服务层或DAO?" 是服务层向下我应该更换.
我正在设计一个基于JPA/Hibernate,Spring和Wicket的新应用程序.DAO和服务层之间的区别对我来说并不清楚.根据维基百科,DAO是
一个对象,它为某种类型的数据库或持久性机制提供抽象接口,提供一些特定的操作而不暴露数据库的细节.
我想知道DAO是否可以包含对数据访问没有太多帮助的方法,但使用查询更容易执行?例如"获取在某些机场运营的所有航空公司的清单"?听起来我更多的是服务层方法,但我不确定在服务层中使用JPA EntityManager是否是良好实践的一个例子?
从.NET执行批量插入MS Access数据库的最佳方法是什么?使用ADO.NET,编写大型数据集需要花费一个多小时.
请注意,在我"重构"它之前,我的原始帖子在问题部分中都有问题和答案.我采取了Igor Turman的建议,并将其重新分为两部分 - 上面的问题,然后是我的答案.
如果我使用像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 ×10
java ×6
spring ×4
architecture ×2
c# ×2
transactions ×2
annotations ×1
bulkinsert ×1
datamapper ×1
hibernate ×1
java-ee ×1
jdo ×1
jpa ×1
jpa-2.0 ×1
ms-access ×1
persistence ×1
repository ×1