我以前使用过Hibernate / JPA,现在使用Spring和MyBatis的组合。
有了JPA/ Hibernate,如果您有一个客户,并且有一个地址,您将有一个与下面的代码类似的域结构。(减去所有注释/ config /映射)。
在使用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发出另一个查询来获取其他数据,但是对数据库进行另一次往返似乎效率很低。
发布于 2015-09-14 01:43:04
您可以将此域对象视为数据库表的“占用空间”。在您的示例中,userId、areaId和Question中的categoryId很可能是对应表中的外键。在创建问题的时刻,您永远不可能需要完整的对象数据,然后使用单独的db请求检索它。如果一次获取所有相关对象,则每个对象至少会有一个额外的表(通过联接-s或子选择-s)。而且,这实际上和Hibernate是一样的。默认情况下,它延迟加载域对象,如果需要未初始化的关联对象,则再次命中数据库。
在那个时候,最好是获取那些域对象不能存在的对象。在您的示例中,问题和列表是耦合的。
当然,如果在另一个应用程序中再次需要用户、类别或任何其他关联对象(假设以前检索到的对象的引用已经丢失),您将使用相同的查询访问数据库。应该这样做,而且看起来效率很低,因为普通的JDBC和SpringJDBC都没有中间缓存,与Hibernate不同。但这并不是JDBC设计的目的。
https://stackoverflow.com/questions/32530780
复制相似问题