Хорошо, этот вопрос лучше всего объясняется в коде. Поэтому постараюсь представить самый краткий пример, который я могу.Hibernate Component with Generics
Timestamped.java
@Embeddable
public class Timestamped<E> {
private E value;
private Date timestamp;
...
}
Foo.java
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
public class Foo {
@Embedded
@AttributeOverides({
@AttributeOverride(name="timestamp", [email protected]("VALUE_TS")),
@AttributeOverride(name="value", [email protected]("VALUE"))
})
private TimestampedValue<E> value;
...
}
Bar.java
@Entity
@DiscriminatorValue("BAR")
public class Bar extends Foo<Double> { }
Что мне нужно е или Bar для использования соответствующего преобразователя типов для value.value и другого преобразователя для каждого подкласса Foo. В идеале я просто хотел бы увеличить этот код, но мне было бы хорошо сделать Foo абстрактным и перемещать поле значений в каждый из подклассов с дополнительными аннотациями.
Если я перемещаю поле значения, как установить тип поля компонента. Есть ли какое-то поле компонента над написанием эквивалента @Type? –
Вам придется объявить его конкретным типом - например, 'private TimestampedValue' и использовать '@ AttributeOverrides'. Hibernate не может иметь дело с генериками - вообще, поэтому все классы, которые вы сохраняете/комментируете, должны явно объявлять параметр типа (или быть не общим). Если иерархия велика, писать пользовательский UserType может быть лучшим подходом. –
ChssPly76
Я закончил с помощью ответа ChssPly76. Таким образом, foo теперь имеет поле «TimestampedValue». –