2010-02-16 2 views
2

Je souhaite remplacer une contrainte dans le validateur Hibernate. Voici ma classe de base:Annulation d'une annotation de validateur d'hibernation?

@Entity 
@Table(name = "Value") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "valueType", discriminatorType = DiscriminatorType.STRING) 
public abstract class Value extends CommonTable 
{ 
    private String    equation; 

    @SimpleEquation(equationType = EquationType.EQUATION) 
    public String getEquation() 
    { 
     return equation; 
    } 

    public void setEquation(String equation) 
    { 
     this.equation = equation; 
    } 
} 

J'ai une classe enfant où je veux préciser que le equationType pour le champ équation est EquationType.ANOTHER_EQUATION, quelque chose comme ceci:

@Entity(name = "CharacteristicUpgradeValue") 
@DiscriminatorValue("CharacteristicUpgradeValue") 
public class CharacteristicUpgradeValue extends Value 
{  
    @Override 
    @SimpleEquation(equationType = EquationType.COST_VALUE) 
    public String getEquation() 
    { 
     return super.getEquation(); 
    } 

} 

ce code jet une exception disant que j'ai une org.hibernate.MappingException: colonne répétée dans le mappage pour l'entité (normal, en raison du getter en double)

Il existe un @AttributeOverride dans Hibernate/jpa mais il semble fonctionner uniquement avec colonne override et pas ce genre de au hommage.

Comment puis-je le faire?

grâce

Répondre

2

Eh bien ... J'ai trouvé une astuce pour y parvenir ... Ce n'est pas très propre ... mais il fonctionne:

ici est ma classe de base:

@Entity 
@Table(name = "Value") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "valueType", discriminatorType = DiscriminatorType.STRING) 
public abstract class Value extends CommonTable 
{ 
    protected String    equation; 

    @Transient 
    public abstract String getEquation(); 

    public void setEquation(String equation) 
    { 
     this.equation = equation; 
    } 
} 

Vous devez spécifier l'accesseur en tant que @Transient, sinon, Hibernate lancera une définition en double pour le champ d'équation. Mon champ d'équation est maintenant protégé et non privé. Et maintenant, sur chacun de votre sous-classe, vous surchargez getEquation en spécifiant la contrainte (et comme @Transient n'est pas hérité par les sous-classes, l'override getEquation sera utilisé pour le mappage du champ d'équation).

Voici un exemple de sous-classe:

@Entity(name = "CharacteristicUpgradeValue") 
@DiscriminatorValue("CharacteristicUpgradeValue") 
public class CharacteristicUpgradeValue extends Value 
{  
    @Override 
    @SimpleEquation(equationType = EquationType.COST_VALUE) 
    public String getEquation() 
    { 
     return equation; 
    } 

} 

Je ne l'ai pas trouvé mieux ...