2011-08-10 8 views
1

スーパークラスのジェネリックフィールドをHibernateにマップしたいと思います。hibernateとgenericフィールドマッピング

私の母のクラスがある:

@Entity 
@Table(name = "ParameterValue") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "parameterType", discriminatorType = DiscriminatorType.STRING) 
public abstract class ParameterValue<C> 
{ 
    private C value; 

    /* HELP NEEDED HERE */ 
    public C getValue() 
    { 
     return value; 
    } 

    public void setValue(C value) 
    { 
     this.value = value; 
    } 
} 

つのサブクラス:あなたは、私がデータベースで使用するためにどのような列を指定する値フィールドを上書き見ることができるように

@Entity 
@DiscriminatorValue(value = "integer") 
@AttributeOverride(name = "value", column = @Column(name = "intValue")) 
public class IntegerParameterValue extends ParameterValue<Integer> 
{ 
} 

。 MyテーブルParameterValueは、各タイプごとに1つずつ複数の列で構成されています。

CREATE TABLE `ParameterValue` (
    `intValue` int(11) DEFAULT NULL, 
    `doubleValue` double DEFAULT NULL, 
    `stringValue` text 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

しかし、休止状態と文句を言い:

ParameterValue.value has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type 

[OK]を、しかし、スーパーでのgetValueのための良好な設定は何ですか? (私は "HELPが必要です"とコメントしました)

答えて

6

Javaの属性を3つの異なる列にマップすることはできません。あなたがこれを使用する必要があります:

@Entity 
@Table(name = "ParameterValue") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "parameterType", discriminatorType = DiscriminatorType.STRING) 
public abstract class ParameterValue<C> { 
    public abstract C getValue(); 

    public abstract void setValue(C value); 
} 

@Entity 
@DiscriminatorValue(value = "integer") 
public class IntegerParameterValue extends ParameterValue<Integer> { 
    @Column(name = "intValue") 
    private Integer intValue; 

    @Override 
    public Integer getValue() { 
     return intValue; 
    } 

    @Override 
    public void setValue(Integer value) { 
     this.intValue = value; 
    } 
} 
+0

このメソッドは、フィールド・アクセスではなく、プロパティー・アクセス(@access(AccessType.FIELD)を使用してくださいParameterValue –

+1

に起因する抽象getValueメソッドに同じ例外をスローするようで、 @TransientアノテーションをgetValueメソッドに追加します。 –