【发布时间】:2011-08-15 20:05:27
【问题描述】:
我有一个抽象类Example 和具体的子类来配合它。我使用鉴别器将数据从数据库中提取出来,如下所示:
<resultMap id="ExampleResultMap" class="Example">
<discriminator column="stateCode" javaType="java.lang.String">
<subMap value="AL" resultMap="AlabamaStateResultMap"/>
<subMap value="AR" resultMap="ArkansasStateResultMap"/>
[...]
</discriminator>
</resultMap>
<resultMap extends="ExampleResultMap"
id="AlabamaStateResultMap"
class="AlabamaState"/>
<resultMap extends="ExampleResultMap"
id="ArkansasStateResultMap"
class="ArkansasState"/>
[...]
因此我有一个AlabamaState 对象(抽象Example 对象的子类),他没有任何属性。这是人为的,但要点是我没有任何唯一标识对象类型的属性——如果不是这种情况,我没有理由这样做。
(注意:这些类不是空的,它们是行为,因此无法将它们重构为不存在。)
如何将其保存回数据库?
理想情况下,ParameterMaps 应该有一个 Discriminator,但似乎没有。
据我所知,有很多不受欢迎的解决方案,其中包括:
- 放弃并在我的所有返回静态字符串的子类上添加一个“getType()”方法。在这种情况下,
AL。 (请注意,我非常努力地避免在我的所有代码中都需要这个,所以这 = OOD-defeat)。 - 制作一个“DB”对象,它与我的大型复杂对象完全一样,但碰巧还有一个额外的字符串,上面写着“哦,顺便说一句,我的 TYPE 是 AL”。
- 在插入对象之前,将我想要保留的所有 20 个属性提取到 HashMap 中。
- 其他一些疯狂的事情,比如使用 toString() 或其他东西来帮助我。
我可能会选择第一个选项,但这似乎很荒谬,不是吗?如果iBatis可以创建它,它不应该可以持久化它吗?我真正需要的是插入的鉴别器。
是我运气不好,还是我忽略了一些明显的东西?
【问题讨论】:
-
你能发布你的 ExampleResultMap 吗?
-
我重写了这个问题......希望现在更清楚了。请注意,resultMap 是创建对象 (db->java) 的示例,现在我想将其保存回 db。
-
用你的例子; CaliforniaState 对象是否有可能声明一个其他州没有的变量?
-
@Gabriel 你找到解决方案了吗?
-
遗憾的是,我将类型添加到我的对象中。