2017-11-27 2 views
0

Ich habe Klassen mit JPA-Zuordnungen wie folgt:JPA einzelne Tabelle Vererbung mit abstrakten Generika und Sammlung

@Entity 
@Inheritance 
public abstract class FieldValue<T> { 
    @Id @GeneratedValue 
    private Long id; 

    public abstract T getValue(); 
} 

@Entity 
public class TextFieldValue extends FieldValue<String> { 
    @Column(name = "TEXT_VALUE") 
    private String value; 

    public String getValue() { return value; } 
} 

@Entity 
public class NumberFieldValue extends FieldValue<Double> { 
    @Column(name = "NUMBER_VALUE") 
    private Double value; 

    public Double getValue() { return value; } 
} 

@Entity 
public class SelectFieldValue extends FieldValue<ValueOption> { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "SELECT_VALUE") 
    private ValueOption value; 

    public ValueOption getValue() { return value; } 
} 

Ich bin eine einzelne Tabelle Vererbung Typ verwendet, die jeweils Wertefeld auf eine andere Spalte zuzuordnen verursacht. In SelectFieldValue ist der Wert eine Referenz auf eine andere Entität, das Mapping funktioniert jedoch weiterhin ordnungsgemäß und füllt die Spalte SELECT_VALUE mit der ID einer ValueOption.

aber ich würde auch die Klasse mit einer Liste von Unternehmen gerne hinzufügen:

@Entity 
public class MultipleSelectFieldValue extends FieldValue<List<ValueOption>>{ 
    @ManyToMany // ?? 
    private List<ValueOption> value; 

    public List<ValueOption> getValue() { return value; } 
} 

ich die richtige Zuordnung zu finden scheinen nicht solche Liste von Einheiten zu behandeln. Ist dies mit der Vererbungsstrategie für einzelne Tabellen überhaupt möglich? Es könnte beispielsweise die Spalte für MultipleSelectFieldValue mit einer ID einer einzelnen Zeile in der Join-Tabelle füllen, die viele-zu-viele-Zuordnungen von MultipleSelectFieldValue zu ValueOption speichern würde.

Ich habe versucht, die folgende Abbildung:

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@JoinTable(name = "field_value_value_option", 
     joinColumns = @JoinColumn(name = "field_value_id"), 
     inverseJoinColumns = @JoinColumn(name = "value_option_id")) 
private List<ValueOption> value; 

Aber seltsam, ist es nicht eine neue Spalte in der Tabelle hinzufügen Fieldvalue, also nicht richtig funktioniert.

+0

@ManyToMany-Beziehung benötigt eine zusätzliche Tabelle zum Speichern der Beziehung. Also sollte dein Mapping funktionieren. Warum denkst du, dass das nicht funktionieren würde? –

+0

Ich fühlte mich gleich, aber eine solche Zuordnung generiert keine zusätzliche Spalte für den MultipleSelectFieldValue der Tabelle. Ich habe meine Frage mit dem Code aktualisiert. –

+0

Warum 'SINGLE_TABLE'? Mit 'JOINED' könntest du alle '@Column (name =" XXXX_VALUE ")' – pirho

Antwort

1

Aber seltsamerweise fügt es der FieldValue-Tabelle keine neue Spalte hinzu, funktioniert daher nicht ordnungsgemäß.

Ich denke, es funktioniert so, wie es sollte.

Spalte wird nicht hinzugefügt, da keine neue Spalte erforderlich ist. Die Join-Tabelle macht das Ding. Ich habe ein bisschen anders Entitätsnamen aber einen Blick auf diese Daten

id |  dtype  | number_value | string_value 
------+------------------+--------------+-------------- 
1551 | StringValue  |    | hi! 
1552 | NumberValue  |   55 | 
1553 | MultiStringValue |    | 
1554 | StringValue  |    | s1 
1555 | StringValue  |    | s2 
1556 | MultiStringValue |    | 

nehmen Dann nehmen Sie einen Blick auf die Zuordnungstabelle

field_value_id | value_option_id 
----------------+----------------- 
      1553 |   1554 
      1553 |   1555 
      1556 |   1554 
      1556 |   1555 

ids Vergleicht man sehen kann, dass Value sich durch Zuordnungstabelle bezieht. Also beide MultiStringValue s hat eine Beziehung zu zwei gleichen StringValue s so ManyToMany funktioniert ohne neue Spalten.

+0

loswerden. Du hast absolut recht. Ich habe es nicht richtig durchdacht. Ich hatte tatsächlich einen anderen Fehler in meinem Code, der die Tests fehlschlagen ließ. Die JPA-Zuordnungen verhalten sich korrekt. –

Verwandte Themen