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