繁体   English   中英

使用Ebean和Play 2.2.x的单向OneToMany中的例外情况

[英]Exception in unidirectional OneToMany using Ebean with Play 2.2.x

我在Play 2.2.1中使用Ebean,我试图在我的实体之间进行单向OneToMany连接。

不幸的是我得到以下异常,我知道如何使用“book_book_id”而不是“book_id”来避免使用ebean:

[PersistenceException:查询抛出SQLException:'on子句中的未知列't1.book_book_id'绑定值:[197]查询为:select t0.book_id c0,t1.cross_ref_id c1,t1.accno c2 from book t0 left outer join cross_ref t1在t1.book_book_id = t0.book_id,其中t0.book_id =? 按t0.book_id排序]

我的第一堂课:

@Entity
@Table(name="book")
public class Book extends Model {

    @Id
    @Column(name="book_id")
    public int bookId;

    @OneToMany(cascade = CascadeType.ALL)
    public List<Cross> crossReferences;

    public static List<Book> filterByIds(List<Integer> BookIds){

        if (BookIds.isEmpty()){
            List<Book> books = new ArrayList<>();

            return books;
        }
        else {
            Query<Book> query = Ebean.createQuery(Book.class);
            query.where(Expr.in("bookId", bookIds));

            return query.findList();
        }
    }
}

secend类:

@Entity
@Table(name="cross_ref")
public class Cross extends Model {

    @Id
    @Column(name="cross_ref_id")
    public int crossRefId;

    @Column(name="book_id")
    public int bookId;

    public int accno;
}

你有@JoinColumn 此外,如果您需要设置连接表,请使用@JoinTable注释。

但似乎你有一个不完整的双边关系(你使用bookID指向Book实体)。

简单说明:使用Ebean进行游戏可能非常智能,因此在许多情况下您甚至不需要注释JoinTables和JoinColumn,只需在适用的地方使用适当的类型即可:

车型/ Book.java

@Entity
public class Book extends Model {
    @Id
    public Integer id;
    public static Finder<Integer, Book> find = new Finder<>(Integer.class, Book.class);

    public String name;

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
    public List<CrossReference> crossReferences;

    public static List<Book> filterByIds(List<Integer> bookIds){
       return find.where().in("id", bookIds).findList();
    }

}

车型/ CrossReference.java

@Entity
public class CrossReference extends Model {
    @Id
    public Integer id;
    public static Finder<Integer, CrossReference> find = new Finder<>(Integer.class, CrossReference.class);

    @ManyToOne
    public Book book;
}

我可以通过插入来解决问题

@JoinColumn(name="book_id", referencedColumnName = "book_id")

public List<Cross> crossReferences;

只是一个小例子,我有一个包含对自身的引用的类。 基本上它应该是树或层次结构。 因此,一个parentelement有许多子元素,一个子元素只有一个父元素。

只要你将你的引用命名为你的类名(例如Element Class的元素),一切都会起作用......但是如果你将它命名为parentElement,那么你将面临异常。

选项1,引用名称=要引用的类名

@Entity
public class Element extends Model {

...

  @ManyToOne(cascade = CascadeType.ALL)
  private Element element;

  @OneToMany(cascade = CascadeType.ALL)
  private List<Criterion> elements = new ArrayList<>();

选项2将mappedBy与其他命名一起使用,例如parentElement

@Entity
public class Element extends Model {

...

  @ManyToOne(cascade = CascadeType.ALL)
  private Element parentElement;

  @OneToMany(mappedBy="parentElement", cascade = CascadeType.ALL)
  private List<Criterion> elements = new ArrayList<>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM