我正在使用Play Framework 2.0.4,在我的模型类中,其中一个变量是Array List<Long>
数据类型,在此处声明:
public List<Long> associateBooks = new ArrayList<Long>();
我有一个视图模板,它调用一个带有两个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
的值,我想将匹配值(另一个争论)添加到属于每个旅程对象的associateBooks
列表(类型Long
)。然后我尝试将更改保存到此迭代期间正在考虑的对象。问题是当我在其他视图模板上打印时,列表associateBooks
似乎仍然为空。
更新:即使我删除了条件,它仍然不会在列表中添加任何内容。
答案 0 :(得分:0)
如果您想保存相关图书清单,也许您想这样做:
注意:我建议创建另一个名为
book_associated
的表。它看起来像这样+--------+-------------------+ |book_id |associated_book_id | +--------+-------------------+ |1 |2 | |1 |3 | +--------+-------------------+
这意味着ID为
的图书相关联1
的图书与ID为2
且3
但是,如果
Book 1
与Book 2
相关联,则会有缺点,我们无法确定Book 2
是否也与Book 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的多对多关系的参考: