【发布时间】:2012-01-25 22:39:36
【问题描述】:
在我的 java 应用程序中,我想为数据库操作实现抽象层。我不想将我的应用程序绑定到任何类型的数据库(实现可以是任意的:SQL、XML、基于文档、一堆丑陋的文本文件等)
实体之间有很多关系,大多数时候,关系是一对多的。
更新和免责声明:虽然例子很简单,但它们只是整个更复杂模型的一部分,它有可能不适合 ORM/SQL 模型(两者都是因为大量数据:~当归一化为关系并且由于数据的不同性质时,有数十亿条记录)。这里我问的是实现简单关系,但这并不意味着它们构成了应用的唯一问题。
一个简化的例子如下:
public class Vehicle {
String mark;
String model;
String registrationId;
}
public class Depot {
String name;
String address;
}
每个实体都有自己的 DAO 接口:
public interface VehicleDAO {
List<Vehicle> getVehicles();
Vehicle getVehicleByRegistrationId(String registrationId);
}
public interface DepotDAO {
List<Depot> getDepots();
Depot getDepotByName(String name);
}
这些 DAO 也被简化了,只是为了展示一些针对特定实体隔离的方法(通过其注册 id 获取车辆,我不需要了解其他实体的任何信息)。
现在有趣的部分来了。 Depot 和 Vehicle 之间的关系是一对多的。所以我必须在我的实体类和 DAO 方法中实现这种关系。
现在我有两种方法:
- 将
List<Vehicle>属性放在Depot类中,并在我获取Depot实例时填充它(可能会改进延迟获取)。这样 DAO 接口就不会改变。 - 引入
Depot和Vehicle的特殊标识符,以便实体类获得额外的整数属性int id;,我们在DAO中添加一个方法List<Vehicle> getVehiclesForDepot(int depotId)。可以通过为标识符引入特殊类而不是普通整数来增强这种方法。
也许还有其他方法?对实体之间的关系进行建模并设计 DAO 接口以保持数据库抽象易于使用且不绑定到任何类型的数据库的最佳方法是什么?我不一定要问完整准确的解决方案,而是解决上述问题时的一些原则。
【问题讨论】:
-
这被称为重新发明轮子 - 使用像 Hibernate 这样的 ORM。
-
@PetarMinchev 使用 ORM 违反了不绑定到任何类型数据库的要求之一
-
然后只对数据库部分使用 ORM。而且我还没有在实际项目中看到将数据存储从数据库更改为
xml例如。 -
很难理解为什么要抽象任何类型的数据源。您是否要将
Depot数据源从 XML 更改为关系“on-the-fly”?您的示例似乎仅适用于关系数据模型(例如 SQL)。我看不太清楚,XML/文本/文档等是如何适应的。为什么需要抽象?你应该先解释一下,然后才能期待一个好的答案 -
我认为关系数据库比
xml文件或任何其他存储更适合存储大量信息。