3

私は忍者フレームワークを使用しており、同じ種類の他のテーブルの 2 つのリストを持つテーブルを作成しようとしています。問題は、他のリストのすべてのコンテンツが他のリスト内にもあることです。

主要:

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());
    }
}

機能テスト:

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();
}

フー:

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

}

バー:

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

}

メインから印刷:

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

期待される:

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

2 に答える 2

1

(コメントを追加することはできませんので、あなたの問題に対する完全な答えとして検討する価値があるかもしれない何かを追加することを許してください)

私の知る限り (Hibernate では、おそらく Ebean でも)、デフォルト @Entityの関係モデルは、指定されていない場合、関係の特定の結合テーブル名を想定しています。_その名前は、関係所有者と中間者の両方を連結したものです。おそらくこの場合、異なるクラス フィールド名に関係なく、ORM マネージャーは、前述の既定のテーブル名を作成しているときに、両方のコレクションに同じテーブル名を作成しました。言い換えれば、おそらく「下」 - 両方のフィールドが同じ結合テーブルを参照しており、このようにして同じコレクションを参照しています。

(現時点ではORMの動作についてテストできないため、これは推測です...)

于 2016-05-07T20:05:34.767 に答える