0

我正在使用 Play Framework 2.0.4,在我的模型类中,其中一个变量是一个Array List<Long>数据类型,在这里声明:

public List<Long> associateBooks = new ArrayList<Long>(); 

我有一个视图模板,它调用具有两个 Long 值的控制器方法,这些值表示相同模型类型的两个不同对象的 id。

GET     /addAssociate/:oID/:id              controllers.Application.addAssociate(oID: Long, id: Long)

调用的控制器方法:

public static Result addAssociate(Long oID, Long id) {

    Book.addAssociate(oID, id);
    return redirect(routes.Application.index());
}

我知道控制器方法正在执行其操作,因为我被重定向到索引页面,并且我知道它接收到值,因为 URL 按预期更改。

问题在于如下所示的 Book 模型方法 addAssociate。

public static void addAssociate(Long oID, Long match) {

    List<Book> allBooks = new ArrayList<Book>();
    allBooks = find.all();

    for(Book book: allBooks) {

        if(book.id == oID) {
            book.associateBooks.add(match);
            book.save();
        }
    }
}

在这种方法中,我想遍历所有书籍对象,如果 id 与oID从视图传递到控制器的变量的值匹配,我想将 match 的值(另一个参数)添加到属于的associateBooks列表(类型Long)中到每个旅程对象。然后,我尝试将更改保存到此迭代期间正在考虑的对象。问题是当我在其他视图模板上打印它时,列表associateBooks似乎仍然是空的。

更新:即使我删除了条件,它仍然不会在列表中添加任何内容。

4

1 回答 1

0

如果你想保存相关书籍的列表,也许你想遵循这个:

注意:我建议创建名为book_associated. 它看起来像这样

+--------+-------------------+
|book_id |associated_book_id |
+--------+-------------------+
|1       |2                  |
|1       |3                  |
+--------+-------------------+

这意味着带有 ID1的书与带有 ID 的书关联,2并且3

但是,如果与关联有一个缺点,我们无法确定是否也关联,因为它没有在表上声明。Book 1Book 2Book 2Book 1

因此,您的模型应如下所示:

@Entity
@Table(name = "book")
public class Book extends Model {
    @Id
    public Long id;

    // other fields
    ...

    @ManyToMany
    @JoinTable(name="book_associated",
        joinColumns=
        @JoinColumn(name="book_id", referencedColumnName="id"),
        inverseJoinColumns=
        @JoinColumn(name="associated_book_id", referencedColumnName="id")
    )
    public List<Book> associateBooks = new ArrayList<>();

    // other methods and finder
    ...

}

在这里,您可以保存任何书籍的所有关联书籍列表。这是供您参考 java 上的多对多关系:

  1. http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany
  2. http://www.objectdb.com/api/java/jpa/ManyToMany
于 2013-05-06T00:35:58.523 回答