如何在不使用ORM和使用直接JDBC(或等效的)的情况下处理这些常见问题?

时间:2010-02-19 15:12:34

标签: java orm jdbc java-ee

只使用JDBC,我通常要考虑以下问题。我并不认为太过努力,只是让事情变得有效,但我想知道人们如何在没有ORM或其他图书馆的情况下处理这些问题。

  1. 渴望与懒惰加载: 您是否只有一个域对象并且让从属子节点为空并且让调用者负责调用DAO以在需要时加载这些子节点?或者您只是为同一个域对象使用多个传输对象?这也意味着您必须为急切案例和惰性案例维护单独的SQL查询。

  2. 域对象和传输对象: 你甚至需要域对象和传输对象吗?对于上述情况,通过传输对象使用域对象的不同表示可能更容易实现。最后,如果使用传输对象,相关对象是否会“分离”?换句话说,如果你有一个有多个孩子的父类,父母会有一个儿童集合的实例,还是会单独请求?

  3. 分配ID: 到目前为止我所做的是捆绑一个事务,然后在最后分配id。但是,这需要公共函数来设置id ...

  4. 级联: 我想唯一的选择就是手动完成......

  5. 还有更多,但这是我现在能想到的全部。

    修改 至于为什么我问这个问题,你知道一些开发团队如何“害怕”使用ORM或者不喜欢它们(通常是因为他们不理解它们),所以有时JDBC是你唯一的选择..

1 个答案:

答案 0 :(得分:1)

嗯,最重要的是,每个问题都有各种解决方案,而正确的解决方案将依赖于上下文:没有一种通用的方法可以说。

例如,对于第三个,我们有一个表,它为每个类型维护一个唯一的id计数器(每个实体类型一行):当你想要一个id时,选择一个类型的当前值然后在数据库中递增它。这个解决方案很简单,但不能很好地扩展:如果你想改进它,那么你可以让应用层批量分配这些id的负载(比如每种类型一次50个),然后根据需要将它们移出插入新数据,只有在池耗尽时才返回到数据库。这实际上是对Oracle's sequences等内容的仿真。

对于第四个,与另一个实体类型有关系的每个实体类(包装单个表的类)负责级联删除等。

最后,ORM只是一个抽象,所以如果你深入了解,所有这些问题都已经被库实现者解决了。在这种情况下,你只需做腿部工作!