如何将数据库行映射到类

时间:2013-08-24 22:03:35

标签: java

让我们假设我有一个数据库表,如:

Table Building
ID int (primary key)
title varchar

为了获取它,我有一个类似的Java类:

class Building{
  private Integer ID;
  private String title;
  ...
}

(如果这有助于你,可以在想象中添加一些JPA注释)。

但是现在,根据实际的建筑,我想执行一些逻辑。

我的第一个想法是创建一个大开关/案例,如:

switch(building.getId()){
  case 1:
    BuildingA buildingLogic = new BuildingA(building);
    break;
  case 2:
    BuildingB buildingLogic = new BuildingB(building);
    break;
  ...
}

buildingLogic.doBuildingSpecificStuff();

但是这将以无限的开关/案例结束,“读”不太清楚。

我的下一个thougt(已经被Mark Elliot的回答所覆盖)是将实际的Class名称作为附加字段(BuildingClass)写入数据库,并使用一些(对我来说当前未知)java magic,从中创建对象building.getBuildingclass()字符串,但我已经假设会有某些缺点......

所以我想也许你们可以给我一些关于我的想法的想法或评论。

2 个答案:

答案 0 :(得分:2)

假设您确实拥有类名,您可以使用反射来实例化一个新实例,尽管沿着这条路径存在一些安全性和性能风险。

String className = "com.foo.bar.Baz";

// gets the actual class (might throw an Exception if the class doesn't exist)
Class<?> clazz = Class.forName(className);

// probably want to have some common interface these conform to, so
// let's assume you have one, you can test this is the right kind of class
CommonBuildingType buildingLogic = null;
if (CommonBuildingType.class.isAssignableFrom(clazz)) {
    // get the constructor to invoke (might throw if no match)
    Constructor constructor = clazz.getDeclaredConstructor(Building.class);

    // safe to cast, we checked above
    buildingLogic = (CommonBuildingType) constructor.newInstance(building);
} else {
    // throw an exception?
}

答案 1 :(得分:0)

你应该使用hibernate来更复杂地实现它