0

Author と Book の 2 つのクラスがあり、両方の関係が定義されていて、適切な JPA アノテーションがありました。私は Play Framework で MVC アーキテクチャを使用しています。コントローラー クラス (アプリケーション) の ORM の動作では、作成者 (idA と nameA) に関する完全な情報がありますが、ビューでは、フィールド nameA は空の文字列のように見えます (idA は正しい)。

以下に、私が何を意味するかを説明します。

著者で:

public class Autor extends Model {

    @Id
    public Long idA;

    @Required
    public String nameA;

    @ManyToMany(mappedBy = "authors")
    public Set<Book> books;
    }

書籍では:

public class Book extends Model {

    @Id
    public Long idB
    @ManyToMany
    @JoinTable(
              name = "creates",
              joinColumns = @JoinColumn(name = "id_b", referencedColumnName = "id_b"),
              inverseJoinColumns = @JoinColumn(name = "id_a", referencedColumnName = "id_a")
          )
    public Set<Autor> authors;
    }

    public static Finder<Long, Book> find = new Finder<Long, Book>(Long.class, Book.class);

    public static List<Book> all()
    {
    return find.all();
    }

GETリクエストの結果として、すべての著者で本を取得しようとしました。ルートファイル行に追加しました:

GET     /books/                 controllers.Application.booksShow()

Application クラスにメソッドを作成しました:

public static Result booksShow(Long)
  {
      return  ok(views.html.booksInfo.render(Book.all()));
  }

Scala のビューのスニペットは次のようになります。

    @for(book <- Books) {
        <li> 
            @book.title
            @book.authors.size()
            @for(author <- book.authors) {
                    <li>@author.nameA</li>
                }
        </li>
    }

ブラウザでリクエストを取得した後、次のようなものを取得します。

Title1 2
[empty line]
[empty line]
Title2 1
[empty line]

しかし、次のようにする必要があります。

Title1 2
Author1
Author2
Title2 1
Author2

私は booksShow メソッドを次のように変更しようとしました:

  public static Result booksShow(Long id)
  {
      List<Books> b = Books.all();
      System.out.println(b.get(0).title);
      System.out.println(b.get(0).authors.iterator().next().nameA);
      return  ok(views.html.booksInfo.render(Ksiazka.all()));
  }

そして私のコンソールに現れました:

Title1
 Author1

しかし、ウェブサイトでは、著者はまだ空です。

Scalaで変更したとき:

@for(author <- book.authors) {
    <li>@author.nameA</li>
}

為に:

@for(author <- book.authors) {
    <li>@author.idA</li>
}

正しい (ゼロ以外、空白でない) ID を取得します。

何か案が?混乱しています。idA と Authors コレクションのサイズを取得しましたが、nameA は空白です。

4

2 に答える 2

0

これを解決するためのいくつかのオプションがあります。すべての関係を設定するために、関係を FetchType.EAGER に設定できます。それが簡単な方法です。パフォーマンスの問題が発生する可能性がありますが、しばらくはそうします。

将来的には、いつどのような情報が必要になるかを考え、セッションが終了する前に必要なフィールドに "get" を実行して入力します。これにより、遅延読み込みがトリガーされ、後でアクセスできるようにフィールドが入力されます。

于 2012-12-26T18:52:12.463 に答える