3

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

主要的:

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

4

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

需要指定唯一的连接名称,我在您的 Foo 类中尝试了此更改并且它有效:

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

}

日志日志

希望能帮助到你。

于 2016-05-14T06:56:02.053 回答
1

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

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

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

于 2016-05-07T20:05:34.767 回答