2011-12-16 15 views
0

Java EEで非常に基本的なライブラリアプリケーションを作成しています。このアプリケーションを使用すると、ユーザーは棚に関連付けられた本を追加できます。この関連付けは双方向で多対1であるため、本が所属する棚をbook.getShelf()に、棚にはshelf.getBooks()を含む書籍を手に入れることができると期待します。多対1の関係の読み込み

残念ながら、新しいBookShelfに追加すると、このBookは、アプリを再デプロイするまでshelf.getBooks()で返されません。私が間違っていることを理解するためにあなたの助けが必要です。

@Entity 
public class Book implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    protected String title; 
    protected String author; 
    @ManyToOne(fetch=FetchType.EAGER) 
    protected Shelf shelf; 

    //getters and setters follow 
} 

@Entity 
public class Shelf implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToMany(mappedBy = "shelf") 
    private List<Book> books; 

    protected String genre; 

    //getters and setters follow 
} 

BookShelfの持続性は、以下のステートレスセッションBeanによって管理され、BookManager

は、ここでエンティティのコードの一部です。また、棚の本のリストを取得する方法(getBooksInShelf)も含まれています。 JSPで

@Stateless 
@LocalBean 
public class BookManager{ 
    @EJB 
    private ShelfFacade shelfFacade; 
    @EJB 
    private BookFacade bookFacade; 

    public List<Shelf> getShelves() { 
     return shelfFacade.findAll(); 
    } 

    public List<Book> getBooksInShelf(Shelf shelf) { 
     return shelf.getBooks(); 
    } 

    public void addBook(String title, String author, String shelf) { 
     Book b = new Book(); 
     b.setName(title); 
     b.setAuthor(author); 
     b.setShelf(getShelfFromGenre(shelf)); 
     bookFacade.create(b); 
    } 

    //if there is a shelf of the genre "shelf", return it 
    //otherwise, create a new shelf and persist it 
    private Shelf getShelfFromGenre(String shelf) { 
     List<Shelf> shelves = shelfFacade.findAll(); 
     for (Shelf s: shelves){ 
      if (s.getGenre().equals(shelf)) return s; 
     } 
     Shelf s = new Shelf(); 
     s.setGenre(shelf); 
     shelfFacade.create(s); 
     return s; 
    } 

    public int numberOfBooks(){ 
     return bookFacade.count(); 
    } 

} 

:(私は本のプレゼンテーションのためのコードの一部だけを書いている)

<jsp:useBean id="bookManager" class="sessionBean.BookManager" scope="request"/> 
// ... 
<% List<Book> books; 
    for(Shelf s: shelves){ 
     books = bookManager.getBooksInShelf(s); 
%> 
     <h2><%= s.getGenre() %></h2> 
     <ul> 
<%  if (books.size()==0){ 
%>   <p>The shelf is empty.</p> 
<%  } 
     for (Book b: books){ 
%>   <li> <em><%= b.getAuthor()%></em>, <%= b.getName() %> </li> 
<%  } 
%>  </ul> 
<% } 
%> 
+0

5年以上前に「J2EE」が「Java EE」にアップグレードされた、PSをどのように維持して、棚を再ロードし、トランザクションを管理するかを示す必要があります。 JPAの概念は全くありません。最新の状態にしてください)。 – BalusC

+0

@BalusCお返事ありがとうございました。今すぐ見ることができるように、私はトランザクションを管理していません(おそらくそれは問題ですか?) – Ale

答えて

1

あなたは双方向の関係を維持しなければなりません。新しいブックを作成してそのシェルフを設定するときは、シェルフのブックにブックを追加する必要があります。