我有一个抽象类,我们称之为Vehicle。柴油机,电气和扩展车辆。这3个类都有自己的方法和变量,以及它们从Vehicle继承的内容。
我想将来自、Electric和Gas对象的变量放入数据库中的相同的表中。从Electric创建的记录只会有几个空列,在这些列中,它没有与国民经济对象相同的变量,等等。
我想要创建插入行、更新行和检索行的方法,所有这些方法都接受这些类中的对象作为参数。
我正在寻找解决这个问题的最佳办法,因为我认为我不知道这是什么。到目前为止,我可以想出几个解决办法,但我不喜欢其中任何一个:
但是第四种可能是什么呢?
发布于 2012-12-24 01:40:44
关于您的选项2:首先您可以使用Vehicle而不是Object,只要、Electric和E 110GasE 211实现/扩展<代码>E 112VehicleE 213。它应该能胜任这份工作。
另外,备选方案2中的ViewVehicle:
公共物体ViewVehicle(目标车辆)
您可以使用一个泛型方法,以便它总是返回它所进入的相同类型。这里有更多信息:http://docs.oracle.com/javase/tutorial/extra/generics/methods.html,...although,我不清楚为什么要将对象发送到方法,然后从方法返回对象。
发布于 2012-12-24 01:44:34
正如你在问题开始时所说:
我有一节抽象的课,我们称之为“车辆”。柴油、电动和燃气工具类车辆。
因此,车辆是超阶级,柴油、电力和天然气是其专长。
数据库上的表可以反映此布局。
Vehicle (id, brand, price, type) // type could help you selecting electric,gas,diesel
Electric(vehicle_id, volts, amp, ohms, other_specific_stuff)
Gas(vehicle_id, pressure, gas_type, other_specific_stuff)
Diesel(vehicle_id, other_specific_stuff) 当您查询您的车辆时,您可以使用左外接。
select * from vehicle as v
left outer join electric as e on (v.id = e.vehicle_id)
left outer join gas as g on (v.id = g.vehicle_id)
left outer join diesel as d on (v.id = d.vehicle_id)然后使用type字段映射到特定的子类。
在数据库中存储或更新对象时,需要一个方法来存储公共部分:
void update(Vehicle v) {
// store v.* in Vehicle table
}以及存储特定汽车的其余部分的方法。
void update(Electric e) {
update(v)
// store e.* on Electric table
}删除和插入也是一样的。
发布于 2012-12-24 01:46:09
幸运的是,其他人也必须处理这个问题:)
你实际上有两个问题。一个是您所标识的API的设计,另一个是如何处理实际的存储/读取到DB。
至于第一个问题,我会选择第二个选项,因为它最好遵循OO设计原则。但是我不会让这个方法接受一个Object。相反,让它接受Vehicle类型。
对于第二个问题,您可以查看以下链接:实体继承映射策略。即使您不打算使用JPA (或任何ORM框架),这些可能也是您想要研究的策略。
下面是对上述链接中提到的单个表策略的更详细解释。这应该给你一个好主意--> 继承:单一表策略
https://stackoverflow.com/questions/14016118
复制相似问题