[英]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.