好的,这个问题最好用代码解释。因此,我会尽量呈现最简洁的例子。带泛型的休眠组件
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> { }
我需要为f或者Bar为value.value使用适当的类型转换器,为Foo的每个子类使用不同的转换器。理想情况下,我只想增加此代码,但是我可以将Foo抽象化并将值字段移动到每个具有附加注释的子类。
如果我移动值字段,如何设置组件字段的类型。是否存在某种类似于@Type的组件字段? – 2009-11-21 09:01:16
您必须将其声明为具体类型 - 例如'private timestampedValue'并使用'@ AttributeOverrides'。 Hibernate无法处理泛型 - 所有持久化/注解的类都必须显式声明类型参数(或者非泛型)。如果你的层次结构很大,编写自定义的UserType可能是一个更好的方法。 –
ChssPly76
2009-11-21 16:30:50
我最终使用ChssPly76的答案。所以foo现在有一个“TimestampedValue值”字段。 –
2009-11-22 23:24:38