0

私は Play Framework 2.0.4 を使用しています。私のモデル クラスでは、変数の 1 つがArray List<Long>データ型であり、ここで宣言されています。

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

同じモデル タイプの 2 つの異なるオブジェクトの ID を表す 2 つの Long 値を持つコントローラー メソッドを呼び出すビュー テンプレートがあります。

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();
        }
    }
}

このメソッドでは、すべての book オブジェクトを調べて、idoIDがビューからコントローラーに渡された変数の値と一致する場合、 match (他の引数) の値を、属するassociateBooksリスト ( type ) に追加します。Long各ジャーニー オブジェクトに。次に、この反復中に考慮されているオブジェクトへの変更を保存しようとします。問題は、他のビュー テンプレートでリストを印刷すると、リストassociateBooksがまだ空に見えることです。

更新:条件を削除しても、リストには何も追加されません。

4

1 に答える 1

0

関連する書籍のリストを保存したい場合は、次のようにすることをお勧めします。

注:という名前の追加のテーブルを作成することをお勧めしますbook_associated。このように見えます

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

これは、ID1を持つ書籍に関連付けられたID を持つ書籍と23

ただし、が関連付けられている場合、テーブルで宣言されていないため、 が関連付けられているかどうかを判断できないという欠点があります。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 に答える