JDBC域设计和关系

时间:2015-09-11 19:24:50

标签: java spring jdbc spring-jdbc

我过去使用过Hibernate / JPA,现在使用Spring JDBC和MyBatis的组合。

使用JPA / Hibernate,如果您有一个拥有地址的客户,您将拥有类似于以下代码的域结构。 (减去所有注释/配置/映射)。

使用JDBC或MyBatis时这是否仍然有意义。这是我所知道的,具有-a,属于等的组合域设计。然而,我见过的大多数JDBC代码示例都有域对象,它们带回ID而不是集合,或者扁平化数据。是否有任何方法,可维护性等方面的性能优势。首先使用JPA,我不确定JDBC的工作方式是什么。

public class Customer {

    private Long id;
    private String userName;
    private String password;
    private String firstName;
    private String lastName;
    private Collection<Address> addresses
    ...
}

public class Address {
    private Long id;
    private String streetAddress1;
    private String streetAddress2;
    private String city;
    private State state;
    private String postalCode;
}

public class State {
    private Long id;
    private String code;
    private String name;
    private Country country;
}

public class Country {
    private Long id;
    private String code;
    private String name;
}

我遇到了一个例子,这是他们的一个班级。

public class Question {
    private long questionId;
    private long categoryId;
    private long userId;
    private long areaId;
    private String question;
    private String verifyKey;
    private Date created;
    private User user;
    private List<Answer> answers;
    private long answerCount;
    private String name;
    // getters and setters omited...
}

为什么要获取userId,areaId和categoryId而不是实际获取关联对象?该ID可能对前端用户没用,我想您可以使用该ID发出另一个查询来获取其他数据,但是再次往返数据库似乎效率低下。

1 个答案:

答案 0 :(得分:0)

您可以将此域对象视为&#34;足迹&#34;数据库表。在您的示例中,来自Question userId areaId categoryId 很可能是来自相应表的外键。在创建问题时,您永远不需要完整的对象数据,并且稍后使用单独的数据库请求检索它。如果一次获取所有关联对象,则每个对象至少会有一个附加表(通过join-s或subselect-s)。而且,这实际上和Hibernate一样。默认情况下,如果需要未初始化的关联对象,它会懒惰地加载域对象并再次命中数据库。

那时,最好是获取域对象不能存在的那些对象。在您的示例中,问题和列表是耦合的。

当然,如果您在某个其他应用程序中再次需要用户,类别或任何其他关联对象(假设对先前检索到的对象的引用已丢失),您将使用相同的查询命中数据库。它应该完成并且看起来效率低下,因为普通JDBC和SpringJDBC都没有与Hibernate不同的中间缓存。但这并不是JDBC的目的。