如何使用Hibernate嵌入泛型字段?

时间:2015-02-24 11:51:29

标签: java hibernate generics jpa

是否可以使用Hibernate嵌入泛型字段?

我尝试以下列方式执行此操作:

@Entity
public class Element<T> {

    @Embedded
    private T value;
...

但我有:

 org.hibernate.AnnotationException: 
 Property value has an unbound type and no explicit target entity.

我知道value的目标类型是SpecificValue类型。但是如何指定呢?

1 个答案:

答案 0 :(得分:2)

由于Type Erasure,Hibernate无法保留通用字段。

但是,我设法找到了一个简单的解决方法:

  1. @Access(AccessType.FIELD)注释添加到课程中。

  2. @Transient注释添加到要保留的字段中。

  3. 创建一个使用此字段的特定 getter和setter。

  4. @Access(AccessType.PROPERTY)添加到getter。

  5. 通过向类添加@Embeddable属性,使字段的类型可嵌入。

  6. 通过这种方式,您将能够拥有特定类型的嵌入属性。

    以下是修改后的代码:

    @Entity
    @Access(AccessType.FIELD)
    public class Element<T> {
    
       @Transient
       private T value;
    
       @Access(AccessType.PROPERTY)
       private SpecificValue getValue() {
           return (SpecificValue) value;
       }
    
       private void setValue(SpecificValue v) {
           this.value = (T) v;
       }
    
    ...
    
    @Embeddable
    public class SpecificValue {
    
    ...