在 GAE、Java、JDO 等环境中,DAO 是啥?

Posted

技术标签:

【中文标题】在 GAE、Java、JDO 等环境中,DAO 是啥?【英文标题】:What is DAO in context of GAE, Java, JDO etc?在 GAE、Java、JDO 等环境中,DAO 是什么? 【发布时间】:2012-06-21 21:39:50 【问题描述】:

我刚开始用 Java 编写 GAE Web 应用程序,所以我对所有这些东西还是有点陌生​​。我使用 JDO 来存储数据。我正在阅读大量在线资料(论坛、教程...),并且到处都可以看到 DAO,但我真的不明白它是什么。是的,数据访问对象,技术...但是当有人将变量命名为 userDAO 时,该变量将包含什么?

让我们考虑以下代码(来自 GAE 文档):

PersistenceManager pm = PMF.get().getPersistenceManager();

Employee e = new Employee("Alfred", "Smith", new Date());

try 
    pm.makePersistent(e);
 finally 
    pm.close();
 

这真的很简单,对我来说很有意义......但是在这个例子中你会怎么称呼 DAO?

这可能是一个愚蠢的问题,但它会帮助我很多。

【问题讨论】:

【参考方案1】:

“DAO”代表数据访问对象。这是一种封装模型逻辑的方法,通过使用提供更直观访问器的类包装给定模型实体。

我不确定您提供的示例,但我愿意推测。看起来 PersistanceManager 是一个管理应用程序数据持久层的对象。您的Employee 对象可能通过此PersistanceManager 实例永久存储,而您构建的Employee 对象可能是一个DAO,它提供了一个接口来管理该员工的状态,这比直接通过PersistanceManager 管理状态更简单.

在 App Engine 上,数据存储区的一大性能限制是反序列化协议缓冲区。如果向模型实体添加复杂的方法,则会增加对象大小,这会在必须反序列化对象时导致性能下降。这里的要点是,您不想在数据存储实体规范中添加除基本属性之外的任何内容。添加辅助方法会导致性能下降。

因此,App Engine 上的一种常见模式是使用 DAO 将模型实体包装在一个类中,该类可以提供这种更高级别的逻辑而不会影响序列化性能。

【讨论】:

很高兴您发现它有帮助! FWIW,我对 App Engine 的 Java 产品不是很熟悉,但对他们的 Python 平台非常熟悉。

以上是关于在 GAE、Java、JDO 等环境中,DAO 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

GAE JDO 空查询结果

GWT+UIBinder+Gin+Guice+JDO+GAE 示例

提交的 JDO 写入不适用于本地 GAE HRD,或可能重用的事务

Gae Jdo 对具有双向导航的一对多拥有关系的持久性

Google App Engine 上的 JDO 与 JPA for Java

spring对dao层的支持