iBatis дискриминатор на вставке - PullRequest
13 голосов
/ 16 августа 2011

У меня есть абстрактный класс 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) сникаких атрибутов на него.Это надумано, но суть в том, что у меня нет атрибута, который бы однозначно определял тип объекта - и я бы не стал, если бы не этот случай.

( Примечание : классы не пустые, они поведенческие , поэтому рефакторинг их из существования невозможен.)

Как сохранить его обратно в базу данных?

В идеале было бы Discriminator для ParameterMap с, но, похоже, его нет.

Насколько я могу судить, существует ряд нежелательных решений, среди которых:

  • Откажитесь и добавьте метод "getType ()" во все мои подклассы, который возвращает статическийстрока.В этом случае AL.(Обратите внимание, что я изо всех сил старался избежать этого во всем моем коде, поэтому имел это = OOD-поражение).
  • Создайте объект «БД», который точно такой же, как мой большой, сложный объект, но, возможно, также имеетдополнительная строка «О, кстати, мой ТИП - АЛ».
  • Извлеките все 20 атрибутов, которые я хочу сохранить в HashMap перед вставкой объекта.
  • Некоторые другие сумасшествия, такие как использование toString () или что-то еще, чтобы выручить меня.

Скорее всего, я пойду с первым вариантом, но это кажется довольно нелепым, не так ли?Если iBatis может создать его, разве он не сможет его сохранить?Что мне действительно нужно, это дискриминатор для вставки.

Мне не повезло, или я просто упускаю из виду что-то очевидное?

1 Ответ

2 голосов
/ 30 ноября 2012

Если у вас нет атрибутов, принадлежащих вашим подклассам, вам следует рассмотреть возможность удаления этих подклассов и добавить перечисление в ваш прежний базовый класс, поскольку единственная цель, которую ваши подклассы служат, состоит в том, чтобы дифференцировать тип ваших объектов (если я вас понял правильно). Использование перечисления для этого проще для расширения и более элегантно в клиентском коде (поскольку вы можете включить перечисление вместо использования блоков выражений instanceof).

Если у вас есть специальные реализации определенных операций на ваших подклассах, вы также можете переместить их в перечисление и поручить делегату базового класса реализацию в перечислении.

EDIT

Вот пример:

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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...