Отображение Hibernate "Custom" Подклассы - PullRequest
0 голосов
/ 12 января 2010

Как новый пользователь Hibernate, я слышал, что хорошим примером добавления некоторых вспомогательных методов в сгенерированные классы является добавление их в подкласс. Например:

// generated via  Hibernate mapping file
public class GeneratedClass {
  long id;
  String someValue;

  // etc, etc.
}

// my own class with pretty printing method
public class MyGeneratedClass extends GeneratedClass {
  public String prettyPrint() {
     return "an object: " + id + "," + someValue;
  }
}

Я хотел бы иметь возможность сделать следующее: иметь возвращаемые объекты Hibernate типа MyGeneratedClass вместо GeneratedClass, чтобы я мог работать с подклассом напрямую. Может ли файл сопоставления быть определен таким образом (то есть без перезаписи какого-либо пользовательского кода генерацией)?

Для любого возможного решения, если GeneratedClass является частью иерархии классов (т. Е. GeneratedClassTypeA, GeneratedClassTypeB, которые расширяют GeneratedClass), будет ли этот шаблон работать?

Полагаю, альтернативой было бы создание статического метода фабрики для создания MyGeneratedClass из GeneratedClass, но это кажется неэффективным для большого количества объектов.

Заранее спасибо!

EDIT

Попробовав стратегию объединенного класса, я понял, что она не работает в моей ситуации из-за существующей иерархии классов и данных. Кроме того, я не мог контролировать поколение от перезаписи моего подкласса (желательная особенность в hbm2java возможно?). Наконец, я подумал о встраивании кода в файл отображения, но переопределение таких вещей, как геттеры и сеттеры, выглядело довольно утомительно.

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

Я бы приветствовал любые другие мысли или комментарии по поводу моего решения.

РЕДАКТИРОВАТЬ 2

Решение, предложенное ниже, с использованием

<meta attribute="generated-class">CountryBase</meta>

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

1 Ответ

1 голос
/ 12 января 2010

То, что я хотел бы сделать, это следующее: есть Hibernate возврат объекты типа MyGeneratedClass вместо GeneratedClass, чтобы я может работать с подклассом напрямую. Можно ли определить файл сопоставления в таким образом?

Да, вам просто нужно указать свой подкласс в отображении: <class name="Subclass" table="table">. Затем вы используете Subclass.class для запроса сущностей.

Для любого возможного решения, если GeneratedClass является частью класса иерархия (т. е. GeneratedClassTypeA, GeneratedClassTypeB оба, которые расширяют GeneratedClass), будет ли этот шаблон все еще работает?

Да. Пока свойства, определенные в сопоставлении, существуют в классе (будь то из-за наследования), он должен работать.

Полагаю, альтернативой было бы создать статический метод фабрики для создать MyGeneratedClass из GeneratedClass, но это кажется неэффективно для большого количества объекты.

Действительно.

EDIT

Я не понял из вашего вопроса, что вы создали класс из сопоставления. Я думал, что это было сгенерировано из какой-то другой модели, которая будет плевать на отображение и класс. Ваш комментарий прояснил это. Затем я бы попробовал подход, используя Hibernate-наследование :

<class name="GeneratedClass" abstract="true">
    <id name="id" type="long" column="XXX">
        <generator class="sequence"/>
    </id>
    <property name="zzzz" column="ZZZZ"/>
    ...
    <union-subclass name="SubClass" table="TABLE">
    </union-subclass>
</class>

Я не тестировал приведенный выше фрагмент, но я вполне уверен, что ваш сценарий может быть отображен так или иначе. abstract=true может быть излишним, но это показывает тот факт, что родительский суперкласс не должен быть создан. У подкласса нет дополнительных свойств, поэтому тег subclass пуст.

РЕДАКТИРОВАТЬ 2

Вы тоже пробовали с <meta attribute="generated-class">CountryBase</meta>? Никогда не использовал это, но это, кажется, соответствует этой цели. Смотрите раздел «Использование базового класса» в Генерация классов Hibernate с hbm2java

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