0

我有两个类:Author 和 Book,定义了两者之间的关系,正确的 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 回答
0

我找到了另一种解决问题的方法(不完全解决,但我得到了我想要的结果):

我没有使用 find.all(),而是通过连接查看查询结果:

在书中:

public static List<Books> allWithAuthors()
{
    return find.fetch("authors").findList();
}

并在应用程序中:

public static Result booksShow()
{
    return  ok(views.html.booksInfo.render(Book.allWithAuthors()));
}
于 2012-12-26T20:47:48.327 回答