Java ORM POJO设计模式问题

时间:2010-08-30 14:45:53

标签: java-ee

我有一般问题,现在我没有看到任何解决它的ORM, 我在数据库中有一个实体,其中包含我不想从数据库加载它们的字段,因为性能问题, 现在,如果我没有在SQL查询中加载它们,那么它们会得到一个默认值(NULL), 有人可以使用此属性并导致错误, 如果我为该结果集创建一个新的POJO,代码将包含许多无法重复使用的“浪费”POJO ......

我已经考虑过延迟初始化,但如果我读了POJO的列表会发生什么 一次,而不是每个元素我尝试使用未初始化的字段 - 这将导致大量的数据库连接和时间加载......

解决此问题的最佳设计模式是什么?

感谢!!!

1 个答案:

答案 0 :(得分:1)

Hibernate允许将任何属性设置为“lazy”。然后它将检测类字节码以按需加载这些字段。正如您所注意到的那样,这可能非常昂贵。

一种解决方案是将对象拆分为两个类A和B,其中B扩展为A.对于简单任务,您告诉框架加载A(只有几个字段)。然后选择所需的所有元素并使用ID加载B。由于您使用主键,因此速度非常快。但是你将有一个开销,即A中的字段将被加载两次。

另一种解决方案是使用HQL加载您需要的属性。如果你在HQL中提到一个列,无论lazy选项说什么,它都会被加载。但是,您将获得一个新的对象列表,其中只设置了这些属性。这意味着您必须手动合并。

结论:没有简单,开箱即用的解决方案可以让每个人都开心。原因是Java不是DB(你不能在RAM中运行对象模型的选择),而且在管理行时DB与Java完全不同。这种分裂是无法解决的,所有OR地图制作者都会受到这种分裂。

对象数据库在这方面要好一些,但它们需要黑客才能搜索对象(例如“列表中名为'John'的所有元素。”

NoSQL DB没有问题,因为每一行都是“key:value”,你必须通过以有用的方式构建“key”来模拟“column”的概念(比如“User:1:name”这是ID为1的User实例的名称。在这里,加入价值很难。

问:为什么我们有多个数据库? A:因为他们都很糟糕 - A. Digulla