所以在最近的一个项目(一个小型内部工具)中,我想使用我们通常在所有项目中使用的ORM工具来试验而不是。原因是我特别不喜欢它们,特别是在具有复杂对象层次结构和关系的复杂项目中。使用ORM很难调试性能问题以及ORM库可能在“优化”下进行的许多事情所引起的其他问题。
所以当我没有ORM工具的帮助时,我想到了一种延迟加载对象的某些属性的方法。假设一个例子:
class Student {
private List<Course> courses;
public List<Course> getCourses() {...}
public void setCourses(List<Course> courses) {...}
}
所以在这种情况下,我们懒洋洋地放入“课程”。所以我想要一种方法来区分未从数据库加载“课程”的场景,以及“课程”实际上是否为空甚至从数据库中取出后。
我可以通过哪些方式实现目标。我在想,可能会关联一个特殊的“课程”类型的空对象,表示数据库中实际上没有数据。并且java null 意味着不从数据库中提取数据。但是这样会破坏抽象,因为这种 lazy 属性的getter需要决定访问DAO来获取数据。
答案 0 :(得分:1)
如果您不喜欢像Hibernate这样的标准ORM库,为什么不使用像iBATIS这样的工具? iBATIS是Hibernate和普通SQL之间的中间环节。本质上,它将结果集映射到Java对象,但它不会为您编写任何SQL。
我们之后从Hibernate切换到它 - 就像你一样 - 发现Hibernate对于更复杂的模式不能很好地工作。
它确实支持动态类增强,但它也支持通过将连接放在SQL中来避免N + 1选择(对不起,这是很难解释的,但请查看user guide以获取更多信息)。
无论如何,为了回答你的实际问题,我可能会通过使用cglib或类似的东西来实现这个来增强一个类(创建一个动态子类)。您保留已加载或未加载的属性的地图,然后您不需要特殊值。
然而,我认为使用已经存在的库可能是一个更好的主意,如果可能的话,重新发明轮子永远不是一个好主意。
答案 1 :(得分:0)
您可以通过使用courses
暗示“未加载”和空null
暗示“已加载但没有可用课程”来区分未加载的课程和Collection
正在加载但是为空”
但是,如果调用了访问者但数据尚未延迟加载,我的偏好是抛出RuntimeException(例如IllegalStateException
)。这使得调试变得更加容易,并且避免了在整个代码中散布null
检查的需要。