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

Posted

技术标签:

【中文标题】在 ebean 中创建一个表,其中两个列表连接到另一个表【英文标题】:Creating a table in ebean with two lists connecting to another table 【发布时间】:2016-08-31 09:14:16 【问题描述】:

我正在使用 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

【问题讨论】:

您是否尝试过将CascadeType 更改为不同的值?在我看来,输入CascadeType.ALL 或完全删除它并查看行为是否保持不变是个坏主意。如果不知道,问题的根源是将所有持久性操作从Bar 一直传播到Foo,这可能导致覆盖表(将两个列表合并为一个表) 【参考方案1】:

这是一个检测到的问题,根据: 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;
    


登录

希望对你有帮助。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于在 ebean 中创建一个表,其中两个列表连接到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

如何将表 id 字段连接到另一个表 id 字段? [关闭]

无法将 UITableViewController 连接到在 xib 中创建的 UITableView

Wordpress 用户和用户元 - 将一个表中的多行连接到另一个表中的一行

在 SQL 中创建互斥分组(带有对的表)

反序列化 JSON 会在表中创建另一个属性并且无法正确返回数据

使用 Counter 对象从两个列表中创建字典