2017-04-23 4 views
1

Ich habe mit dem folgenden Code für FeatureDisseminationArea als subcalss zuzugreifen:Wie Diskriminator Spalte in JPA

@Entity 
@Table(name = "features") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "subtype_id", discriminatorType = DiscriminatorType.INTEGER) 
public class Feature { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(generator="sqlite") 
    @TableGenerator(name="sqlite", table="sqlite_sequence", 
     pkColumnName="name", valueColumnName="seq", 
     pkColumnValue="features") 
    @Getter 
    @Setter 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "subtype_id") 
    @Getter 
    @Setter 
    private FeatureSubtype featureSubtype; 

    @ManyToOne 
    @JoinColumn(name = "parent_id") 
    @Getter 
    @Setter 
    private Feature parent; 

    ...  
} 

Leider bewirkt dies eine Ausnahme, wenn speichern diese Entität Datenbank, weil subtype_id Feld zweimal verwendet wird.

Kann ich es irgendwie annotieren, damit JPA weiß, dass es das gleiche Feld ist?

+0

Warum brauchen Sie die gleiche Spalte für beide? –

+0

@ PeterŠály Ich nicht. Aber würde gerne wissen, ob ich es war. – Dims

Antwort

0

Derselbe Spaltenname wird für die Beziehung FK zum FeatureSubtyp verwendet. Verwenden Sie einen anderen Namen für den Diskriminator oder verwenden Sie keinen Diskriminator.

In Hibernate wird die Diskriminatorspalte für verknüpfte Vererbung unterstützt, aber nicht erforderlich. Hibernate fragt alle Untertabellen ab, um die richtige Unterklasse zu ermitteln.

+0

Also, entfernen Sie einfach Diskriminator Annotation? – Dims

+0

Ja, hast du es versucht? –

+1

Entschuldigung, ich habe das Feld entfernt. Außerdem muss ich den diskriminierenden Spaltentyp einstellen, und der einzige Weg dazu ist diese Annotation. Wird Ihre Antwort akzeptieren, wenn Sie fertig sind. – Dims

0

Wenn eine Diskriminator-Spalte Sinn macht mit InheritanceType.JOINED ist es diskussionswert. Ich würde es bei verbundenen Strategien weglassen und es nur mit InheritanceType.SINGLE_TABLE verwenden.

Trotzdem ist es möglich, es ohne doppelte Spaltenfehler zuzuordnen.

Wenn Ihr Ober Einheit eine Erbschaft/Diskriminator Definition hat wie:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "subtype_id", discriminatorType = DiscriminatorType.INTEGER) 

Sie müssen nur die Zuordnung anpassen nicht den Wert wie gewohnt zu aktualisieren, indem sie nur lesbar Einstellung:

@Column(name="subtype_id", insertable = false, updatable = false) 
protected int subTypeId; 

public int getSubTypeId() { 
    return subTypeId; 
} 

Jetzt Sie können auf den Diskriminatorwert der Entität zugreifen.

Verwandte Themen