2011-08-10 4 views
1

Je souhaite mapper un champ générique dans une superclasse avec Hibernate.Mise en correspondance hibernate et générique

Ma classe maternelle est:

@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; 
    } 
} 

Une sous-classe:

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

Comme vous pouvez le voir, je passer outre le champ de valeur pour spécifier quelle colonne à utiliser dans la base de données. Ma table ParameterValue est composée de plusieurs colonnes, une pour chaque type.

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

Mais hibernate se plaint que:

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, mais ce qui est la bonne configuration pour getValue dans la superclasse? (J'ai mis un commentaire avec "HELP NEEDED HERE")

Répondre

6

Je suis sûr que vous ne pouvez pas mapper un seul attribut Java à trois colonnes différentes. Vous devrez utiliser:

@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

Cette méthode semble jeter la même exception en raison de la méthode abstraite getValue dans ParameterValue –

+1

Assurez-vous d'utiliser l'accès sur le terrain plutôt que des biens d'accès (@access (AccessType.FIELD), ou ajoutez une annotation @Transient à la méthode getValue. –

Questions connexes