у меня есть класс
@MappedSuperclass
public abstract class MyAbstractProperty <T extends Object>{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Column(name="defaultValue")
protected T defaultValue;
//...
}
Что является основой для подклассов, таких как class MyLongProperty extends MyAbstractProperty<Long>{}
. Это прекрасно работает. Проблема возникает, когда я хочу сохранить текст в классе class MyStringProperty extends MyAbstractProperty<String>{}
.
Я узнал, что спящий режим по умолчанию хранит строки только с максимальным количеством символов 255 (см.: JPA: слишком длинные данные для столбца не изменяются). Поэтому моему defaultValue
потребуется дополнительная аннотация, например:
@Entity
class MyStringProperty extends MyAbstractProperty<String>{
@Type(type="org.hibernate.type.StringClobType")
@Column(name="defaultValue")
protected String defaultValue; // problem since defaultValue is already defined in MyAbstractProperty<>.
}
Как я могу обеспечить это, поскольку значение по умолчанию уже определено в MyAbstractProperty
? Я не думаю, что можно переместить аннотацию типа на MyAbstractProperty
, так как это может иметь побочные эффекты для других классов, таких как MyLongProperty
.
Например, когда я устанавливал @Lob
в MyAbstractProperty
, определение SQL MyStringProperty
включало DEFAULTVALUE BLOB(255)
вместо DEFAULTVALUE BIGINT
.
Дополнительный вопрос: похоже, существуют разные варианты определения столбца как текстовых данных (например, @Type(type="org.hibernate.type.StringClobType")
, @Lob
). В чем основные различия этих параметров. Что лучше взять. (Моя основная база данных — HyperSQL, но я также ориентируюсь на SQLite, MariaDB и MySQL).
Изменить
Основываясь на недавних отзывах, кажется, что решение может быть абстрактным геттером/сеттером. Я должен проверить, каковы последствия этого для моего кода.
У меня была альтернативная - незаконченная - идея, которая могла бы вызвать меньше модификаций моего кода. Можно ли определить класс
class MyText extendes String;
например, все экземпляры MyText
автоматически сохраняются как @Lob
? Тогда мне просто нужно изменить MyAbstractProperty<String>
на MyAbstractProperty<MyText>
.
@Column
для общей (T) переменной. У Hibernate не было бы возможности узнать, как отобразить это. Кроме того, поскольку у каждой переменной есть один столбец, у вас не может быть столбца, который может содержать, например, как строку, так и целое число. - person Tobb   schedule 01.03.2017