我在Play 2.2.1中使用Ebean,我试图在我的实体之间进行单向OneToMany连接。
不幸的是,我得到以下异常,并且我知道如何使用“book_book_id”而不是“book_id”来避免使用ebean:
[PersistenceException:Query抛出了SQLException:未知列 'on子句'中的't1.book_book_id'绑定值:[197]查询是:选择 t0.book_id c0,t1.cross_ref_id c1,t1.accno c2 from book t0 left outer 在t1.book_book_id = t0.book_id上加入cross_ref t1,其中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 class:
@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;
}
答案 0 :(得分:1)
你有@JoinColumn。此外,如果您需要设置连接表,请使用@JoinTable注释。
但似乎你的双边关系不完整(你使用bookID指向Book
实体)。
答案 1 :(得分:1)
请注意:使用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;
}
答案 2 :(得分:0)
我可以通过插入
解决问题@JoinColumn(name="book_id", referencedColumnName = "book_id")
到
public List<Cross> crossReferences;
答案 3 :(得分:0)
只是一个小例子,我有一个包含对自身的引用的类。基本上它应该是树或层次结构。因此,一个parentelement有许多子元素,一个子元素只有一个父元素。
只要您将您的引用命名为您的类名(例如Element Class的元素),一切都会有效......但如果您将其命名为parentElement,则会遇到异常。
选项1,引用名称=要引用的类名
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(yourChartPanel, Integer.valueOf(0)); // The "0" mask is equivalent to no mask. You could also set a different modifier.
选项2将mappedBy与其他命名结合使用,例如parentElement 强>
@Entity
public class Element extends Model {
...
@ManyToOne(cascade = CascadeType.ALL)
private Element element;
@OneToMany(cascade = CascadeType.ALL)
private List<Criterion> elements = new ArrayList<>();