设计保存在数据库中的对象是否有普遍接受的做法?

Eri*_*son 2 java database

是否有一种普遍接受的做法来设计经常加载和保存到数据库和从数据库保存的java对象?

我现在使用的方法是有一个主数据库对象,它打开与数据库的连接.在我的应用程序中我需要加载或保存对象的任何地方,我创建了一个用于加载和保存的源接口.例如,我可能会这样做:

public interface CalendarSource {
  public Appointment[] getAppointmentsForMonth(int year, int month);
  public void saveAppointment(Appointment appointment);
}

然后我将在主数据库对象上实现该接口.任何子数据也会同时加载到主对象内的成员对象中.就像每个约会的客人名单一样.这很好用,因为我使用的所有数据都来自两个数据库中的一个,所以我保持两个数据库连接,每个源都由其中一个实现.

问题是,这有时似乎很笨拙.令人困惑的是如何处理ID值,因为我真的不想将它们添加到我的对象中.它还需要一个数据库连接来实现几个不同的接口.实际上,我的数据库包必须依赖于项目中的几乎每个包,因为它实现了所有接口.这在某个层面上确实有意义,但我想知道是否有更好的方法.

我选择这种架构有两个主要原因:

  • 我希望我使用的对象不知道它们是从数据库加载或保存的.我可能希望将来使用平面文件替换此数据库源以实现可移植性.
  • 我想拥有一个良好的包依赖层次结构.应隔离数据库代码,以便可以轻松地将对数据库模式的更改更新为代码.

我遇到的一个问题是如何处理ID值.由于对象不应该知道它们是数据库对象,因此它们不应该包含ID字段.但是,如果我尝试将对象写入数据库,并且我没有ID值,那么我应该知道是否应该插入或更新?

我也担心数据库包会扩展整个项目的所有内容.我经常传递这些源接口.我想这也是有道理的.

也许我只是在寻找一些我做得对的验证,而且我没有看到一些明显的简单解决方案.别误会我的意思 - 一切正常.

有什么想法吗?

hvg*_*des 5

我认为最普遍的模式是DAO模式.也就是数据访问对象.基本上,您定义了一个指定行为的接口(如基本的crud操作和域的专用行为),然后提供实现.对于额外的点,你可以使用泛型是java 5和更高版本来编写更少的代码.

http://www.ibm.com/developerworks/java/library/j-genericdao.html

将所有持久性代码保存在应用程序的一个层中是一个重要的设计选择.它有助于保持代码简单和干净.

从你的帖子中,你不想做你正在做的事情.使用Spring或等价物,因为它会为你处理很多代码.它管理连接,交易等.

此外,不要担心您的课程上有ID字段.虽然你可能不认为它是完美的,但它会让生活更轻松.选择对抗更大的设计战斗,比如做TDD并保持设计清洁.

  • 我在原始问题中没有看到关于平面文件的内容.我以为你有一个数据库,可能希望将来转到平面文件.无论如何,DAO模式仍然适用.您可以拥有数据库的实现和文件的实现.无论如何,你所描述的实际上是DAO模式.是的,Spring非常大,但我认为它们可以为你提供很多功能,包括他们的罐子.而且他们可能比普通程序员做得更好. (2认同)