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

时间:2013-12-02 08:56:39

标签: java playframework playframework-2.0 ebean

我在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;
}

4 个答案:

答案 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<>();