代码之家  ›  专栏  ›  技术社区  ›  Erick Robertson

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

  •  2
  • Erick Robertson  · 技术社区  · 15 年前

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

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

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

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

    • 我希望我使用的对象不知道它们是从数据库加载或保存的。为了便于移植,我可能希望将来用平面文件替换此数据库源。
    • 我想要一个好的包依赖层次结构。数据库代码应该是隔离的,这样对数据库模式的更改就可以很容易地更新到代码中。

    我遇到的一个问题是如何处理ID值。因为对象不应该知道它们是数据库对象,所以它们不应该有ID字段。但是,如果我试图向数据库中写入一个对象,而我没有ID值,我怎么知道应该执行插入还是更新呢?

    我还关心让数据库包在整个项目中扩展所有内容。我一直在传递这些源接口。我想这也有道理。

    也许我只是想验证一下我做的对不对,这里没有什么明显的简单的解决方案我看不到。别误会,一切都很好。

    4 回复  |  直到 13 年前
        1
  •  5
  •   hvgotcodes    15 年前

    我认为最普遍的模式是道模式。即数据访问对象。基本上,您定义一个接口来指定行为(如基本crud操作和域的专门行为),然后提供实现。另外,您可以使用泛型Java5和更高版本来编写更少的代码。

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

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

    另外,不要担心在类中有ID字段。虽然你可能认为它不完美,但它让生活更轻松。选择对抗更大的设计之争,比如做TDD和保持你的设计整洁。

        2
  •  2
  •   S.Lott    15 年前

    不要自己滚。

    看看Hibernate,iBatis和JPA。

    在所选技术中完全实现。

    现在你已经实现了一些东西,你已经学会了技术,现在可以做出一个理性的选择去追求一个替代品或者坚持你最初选择的那个。

    重要提示:不要自己滚。

        3
  •  2
  •   Gabor Jakab    15 年前

    您提出的“一个中央数据库对象”和“子数据也被加载”的方法似乎是一个好的设计方向。

    然而,由于这是2010年的java,数据存储和所有相关的问题都已经实现了。此外,您还有像JDBC、JPA和JDO这样的规范,对于这些规范,还有一些实现,比如Hibernate、OpenJPA、EclipseLink。。。

    http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html ).

    您可以在该xml中定义持久的Java Class-DB表映射( http://docs.jboss.org/hibernate/core/3.3/reference/en/html/xml.html http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/ ).

    您将使用Hibernate会话/实体管理器将持久性对象状态保存到表中( http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ )

    对于Id值:在大多数情况下,生成这些值有几种可能的方法( http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id )

    您可以独立于DB表,您可以随时重构、重命名这些表,因为它们可以被重新配置。对于更复杂的更改,您应该检查( http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html )

    http://java.sun.com/developer/technicalArticles/Programming/serialization/ )

    Java World Hibernate Tutorial

        4
  •  1
  •   bwawok    15 年前

    我说最简单的结构通常是

    创建具有所需字段的域对象。

    Public class Appointment {
    private Date appointmentDate;
    private String locationName;
    List<Person> appointmentAttendees;
    }
    

    然后你有一个数据库,它将一个字段映射到一列。。。并将其放入Hibernate中,以便从一个对象到另一个数据库对象来回切换。

    那能满足你所有的需要吗?谁知道呢。取决于你需要什么:P