2012-12-26 23 views
0

我有兩個類:Author和Book,定義了兩個JPA註釋之間的關係。我在Play Framework中使用MVC架構。 在控制器類(應用程序)ORM作品中,我有關於作者(idA和nameA)的完整信息,但在視圖中,字段名稱A看起來像空字符串(idA是正確的)。如何在遊戲框架中的視圖中獲得ORM之後的非關係關係的完整信息?

下面我來解釋我的意思:

在作者:

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

開創了應用類梅索德:

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

片段中的觀點在斯卡拉看起來是這樣的:

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

GET請求後在瀏覽器中我得到這樣的東西:

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 

但在網站上,作者仍然空;

當我在斯卡拉改變:

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

爲:

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

我改正(非零,非空)的ID。

有什麼想法?我很困惑,我收到了idA和Authors集合的大小,但nameA是空白的。

+0

你不必與作者日期/作者的問題? –

+0

Oryginally所有變量/類名稱都是波蘭語(或多或少,實際上,英文和波蘭語的名字是和平共存的),我已經在發佈我的問題之前改變了它們以澄清(對於其他用戶)。作爲編輯器,我使用了TextArea,可能我錯過了它。 –

回答

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

嗯。抱歉。我的評論應該回到你的問題,不一致的地方,這裏不是答案。我會移動它。 –

0

你有解決這個問題的一些選擇。您可以將您的關係設置爲FetchType.EAGER以填充所有關係。這是簡單的方法。最終會出現性能問題,但暫時會做。

對於未來,考慮需要什麼樣的信息,並在會話關閉之前填充所需的字段,只需對它們進行「獲取」即可。這將觸發延遲加載並填充字段以供以後訪問。

+0

謝謝,我也讀到了讀取和改變標註在書類: '@ManyToMany(取= FetchType.EAGER) @JoinTable( 名= 「創造」, joinColumns = @JoinColumn(NAME = 「ID_B」 ,referencedColumnName =「id_b」), inverseJoinColumns = @JoinColumn(name =「id_a」,referencedColumnName =「id_a」) ) public Set authors; }' 但我仍然得到空字符串。我從來沒有使用JPA和ORM,我不知道我在哪裏可以找到解決我的問題。 –

+0

對我來說,這聽起來像是遊戲所使用的持久性框架中的一個錯誤。你的解決方案完全一樣,但明確。 – sorencito