插入时的iBatis Discriminator

时间:2011-08-15 20:05:28

标签: java ibatis

我有一个抽象类Example和具体的子类来配合它。我使用鉴别器来提取数据库的数据 out ,如下所示:

<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对象的子类),对他没有任何属性。这是设计的,但要点是我没有任何唯一标识对象类型的属性 - 如果没有这种情况我没有理由。

注意:这些类不是空的,它们是行为,所以重构它们不是一种选择。)

如何将其保存回数据库?

理想情况下,Discriminator会有ParameterMap,但似乎没有。{/ p>

据我所知,有许多不受欢迎的解决方案,其中包括:

  • 放弃并在我的所有返回静态字符串的子类上添加“getType()”方法。在这种情况下,AL。 (请注意,我非常努力地避免在我的所有代码中都需要这样做,所以这个= OOD-defeat)。
  • 创建一个“DB”对象,它与我的大型复杂对象完全相同,但碰巧还有一个额外的字符串,说“哦,顺便说一下,我的TYPE是AL”。
  • 在插入对象之前,将我想要保留的所有20个属性提取到HashMap中。
  • 使用toString()等其他一些疯狂来帮助我。

可能我会选择第一个选项,但这看起来很荒谬,不是吗?如果iBatis可以创建它,它不应该能够坚持下去吗?我真正需要的是插入的鉴别器。

我运气不好,还是我只是忽略了一些明显的东西?

1 个答案:

答案 0 :(得分:2)

如果你没有属于你的子类的属性,你应该考虑删除这些子类并为你以前的基类添加一个枚举,因为你的子类服务的唯一目的是区分对象的类型(如果我理解你的话)正确)。使用枚举更容易扩展,并且在客户端代码中更优雅(因为您可以打开枚举而不是使用instanceof表达式块)。

如果您的子类上有特定的某些操作实现,您也可以将它们移动到枚举中,并让您的基类委托给枚举上的实现。

修改

以下是一个例子:

public interface GreetingStrategy {
    abstract String sayHello();
}

enum UserType implements GreetingStrategy {
    ADMIN {
        @Override
        public String sayHello() {
            return "hello from admin";
        }
    },

    GUEST {
        @Override
        public String sayHello() {
            return "hello from guest";
        }
    };

}

class User {

    private final GreetingStrategy greetingStrategy;

    public User(GreetingStrategy greetingStrategy) {
        this.greetingStrategy = greetingStrategy;
    }

    public String sayHello() {
        return greetingStrategy.sayHello();
    }

}