2016-05-05 10 views
3

Ich benutze Ninja Framework und ich versuche, eine Tabelle zu erstellen, die zwei Listen von anderen Tabellen der gleichen Art hat. Das Problem besteht darin, dass der gesamte Inhalt der anderen Liste ebenfalls in der anderen Liste enthalten ist.Erstellen einer Tabelle in Ebean mit zwei Listen Verbindung zu einer anderen Tabelle

Main:

test(); 

List<Foo> foos = Foo.find.all(); 

for(Foo foo : foos){ 
    System.out.println("Printing bars1, size: " + foo.getBars1().size()); 
    for(Bar bar : foo.getBars1()){ 
     System.out.println(bar.getText()); 
    } 
    System.out.println("Printing bars2, size: " + foo.getBars2().size()); 
    for(Bar bar : foo.getBars2()){ 
     System.out.println(bar.getText()); 
    } 
} 

Funktionstest:

private void test() { 
    Foo foo = new Foo(); 

    Bar bar1 = new Bar(); 
    Bar bar2 = new Bar(); 

    bar1.setText("This should only be in bars1"); 
    bar2.setText("This should only be in bars2"); 

    foo.getBars1().add(bar1); 
    foo.getBars2().add(bar2); 

    foo.save(); 
} 

Foo:

package models; 

import java.util.List; 
import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.OneToMany; 

@Entity 
public class Foo extends BaseModel { 

    public static final Find<Long, Foo> find = new Find<Long, Foo>() {}; 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<Bar> bars1; 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<Bar> bars2; 

    public List<Bar> getBars1() { 
     return bars1; 
    } 

    public void setBars1(List<Bar> bars1) { 
     this.bars1 = bars1; 
    } 

    public List<Bar> getBars2() { 
     return bars2; 
    } 

    public void setBars2(List<Bar> bars2) { 
     this.bars2 = bars2; 
    } 

} 

Bar:

package models; 

import javax.persistence.Entity; 
import javax.validation.constraints.Size; 

@Entity 
public class Bar extends BaseModel { 

    public static final Find<Long, Bar> find = new Find<Long, Bar>() {}; 

    private String text; 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

} 

Drucken von Haupt:

Printing bars1, size: 2 
This should only be in bars1 
This should only be in bars2 
Printing bars2, size: 2 
This should only be in bars1 
This should only be in bars2 

Erwartet:

Printing bars1, size: 1 
This should only be in bars1 
Printing bars2, size: 1 
This should only be in bars2 
+0

Haben Sie versucht, 'CascadeType' auf einen anderen Wert zu setzen? Es scheint mir eine schlechte Idee zu sein, 'CascadeType.ALL' einzutippen oder es komplett zu entfernen und zu sehen, ob das Verhalten gleich bleibt. Wenn Sie nicht wissen, dass der Grund des Problems alle Persistenzoperationen von "Bar" bis zum "Foo" weiterleitet, was zum Überschreiben der Tabelle führen könnte (das Verbinden von zwei Listen in einer Tabelle) – MichaelDD

Antwort

3

Es wurde ein erfasstes Problem nach: https://github.com/ebean-orm/avaje-ebeanorm/issues/445

benötigt wird, eine eindeutige angeben beitreten Namen, habe ich versucht, diese Änderung in Ihrer Foo Klasse und es hat funktioniert:

@Entity 
public class Foo extends BaseModel { 

    public static final Find<Long, Foo> find = new Find<Long, Foo>() {}; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "bars1") 
    private List<Bar> bars1; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "bars2") 
    private List<Bar> bars2; 

    public List<Bar> getBars1() { 
     return bars1; 
    } 

    public void setBars1(List<Bar> bars1) { 
     this.bars1 = bars1; 
    } 

    public List<Bar> getBars2() { 
     return bars2; 
    } 

    public void setBars2(List<Bar> bars2) { 
     this.bars2 = bars2; 
    } 

} 

log log

Hoffe es hilft.

1

(I Kommentar nicht hinzufügen können, so verzeiht mir für etwas hinzufügen, die nur wert sein könnte als eine vollständige Antwort auf Ihr Problem in Anbetracht)

Soweit ich weiß (in Hibernate, also vielleicht auch in Ebean), geht das Standard-Beziehungsmodell @Entity davon aus, wenn nicht angegeben, bestimmte Join-Tabellennamen für Beziehungen. Dieser Name ist eine Verkettung beider Beziehungsinhaber und _ in der Mitte. In diesem Fall erstellt der ORM-Manager in diesem Fall, unabhängig vom Namen der Klassen-Datei, beim Erstellen des angegebenen Standardtabellennamens denselben Tabellennamen für beide Sammlungen. Mit anderen Worten: vielleicht "drunter" - beide Felder verweisen auf dieselbe Join-Tabelle und auf diese Weise auf dieselbe Sammlung.

(Dies ist mehr Vermutung, weil ich in diesem Moment erwähnt ORM Verhalten nicht testen ...)