在同一 JVM 上实现 Java DAO 模式

Implementing Java DAO Pattern on the Same JVM

这个问题关系到对JavaDAO模式的核心理解。请看一个简单的java dao pattern example来理解我的问题。

在下面的第 2 行,student 对象已经更改为新名称,如果客户端和后端都运行在同一个 JVM 下,第三行的重点是什么?

以我对DAO模式的浅薄理解,客户端只能使用服务改变数据,比如下面的studentDao,客户端不应该有直接改变值对象(pojo)的可能性。但是当客户端和后端服务运行在同一个JVM下,并且客户端拿到一个普通setter的POJO,为什么客户端还要调用服务呢?

是否有任何最佳实践来实现 DAO 模式,其中客户端可以并且必须仅 consume/alter 使用 dao 服务的数据?一个很好的例子会很好看。

//update student
1. Student student =studentDao.getAllStudents().get(0);
2. student.setName("Michael");
3. studentDao.updateStudent(student);

嗯,这在同一个 JVM 上是什么意思。如果您的 DAO 使用 DB,那么当您更改 POJO 时,对象不会在 DB 中更改。同样,当其他线程将加载相同的实体时,新的 POJO 将根据 DB 内容创建(除非您的 DAO 进行了一些特殊的缓存)=>没问题。

所以现在让我们假设您构建某种内存中的 DAO。如果实施不当,在这种情况下,POJO 上的更改可以 "effect" 其他客户端,正如您已经指出的那样。然而,这不是 DAO 的良好实现——因此您必须注意客户端可访问的 POJO 不能影响 DAO "state"。对于所有 returned 值以及所有输入(插入、更新等),最简单的方法总是 return defensive copies