【问题标题】:Representing incomplete objects when loading from database从数据库加载时表示不完整的对象
【发布时间】:2010-02-12 16:28:15
【问题描述】:

所以在最近的一个项目(一个小型​​内部工具)中,我想使用我们通常在所有项目中使用的 ORM 工具来试验 not。原因是我特别不喜欢它们,特别是在具有复杂对象层次结构和关系的复杂项目中。使用 ORM 会变得难以调试性能问题以及由 ORM 库可能会在后台进行“优化”的许多事情引起的其他问题。

所以当我没有 ORM 工具的帮助时,我正在考虑一种延迟加载对象的某些属性的方法。假设一个例子:

class Student {
private List<Course> courses;

public List<Course> getCourses() {...}
public void setCourses(List<Course> courses) {...}
}

所以在这种情况下,我们懒惰地放置“课程”。所以我想要一种方法来区分“课程”尚未从数据库加载的场景和“课程”实际上为空的场景,即使在从数据库中获取后也是如此。

我可以实现它的典型方法是什么。我在想可能会关联一个“Course”类型的特殊空对象,表示数据库中实际上不存在数据。而 java null 意味着数据不是从数据库中获取的。但这会破坏抽象,因为此类 lazy 属性的 getter 需要决定访问 DAO 以获取数据。

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

    如果你不喜欢像 Hibernate 这样的标准 ORM 库,为什么不使用像 iBATIS 这样的工具呢? iBATIS 是 Hibernate 和普通 SQL 之间的中途之家。本质上,它将结果集映射到 Java 对象,但它不会为您编写任何 SQL。

    在发现 Hibernate 不能很好地处理更复杂的架构之后,我们从 Hibernate 切换到它。

    它确实支持动态类增强,但它也支持通过将连接放入 SQL 中来避免 N+1 选择(抱歉,这解释得不好,但请查看 user guide 了解更多信息)。

    无论如何,要回答您的实际问题,我可能会通过使用 cglib 或类似的东西来增强类(创建动态子类)来实现这一点。您保留已加载或未加载的属性的 Map,然后您不需要特殊值。

    但是我认为使用已经存在的库可能是一个更好的主意,如果可能的话,重新发明轮子绝不是一个好主意。

    【讨论】:

      【解决方案2】:

      您可以通过使用 null 表示“未加载”和使用空的 Collection 表示“已加载但没有可用的课程”来区分课程未加载和 courses 已加载但为空。

      但是,如果调用了访问器但尚未延迟加载数据,我的偏好是抛出 RuntimeException(例如IllegalStateException)。这使调试变得更加容易,并且避免了在整个代码中散布null 检查的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多