在 ebean 中创建一个 table,两个列表连接到另一个 table

Creating a table in ebean with two lists connecting to another table

我正在使用 Ninja 框架,我正在尝试创建一个 table,其中包含两个同类的其他 table 列表。问题是另一个列表中的所有内容也在另一个列表中。

主要:

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

(我无法添加评论,所以请原谅我添加了一些可能值得考虑作为您问题的完整答案的内容)

据我所知(在 Hibernate 中,可能在 Ebean 中也是如此),默认的 @Entity 关系模型假设,如果没有指定,关系的某些连接 table 名称。该名称是关系所有者和中间 _ 的串联。也许在这种情况下,无论不同的 class 文件名称,ORM 管理器在创建提到的默认 table 名称时,都会为两个集合创建相同的 table 名称。换句话说:也许 "underneath" - 两个字段都引用同一个连接 table 并且以这种方式引用同一个集合。

(这更多是猜测,因为我目前无法测试提到的 ORM 行为...)

这是一个检测到的问题: https://github.com/ebean-orm/avaje-ebeanorm/issues/445

需要指定一个唯一的连接名称,我在你的 Foo class 中尝试了这个更改并且成功了:

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

}

日志

希望对您有所帮助。