0
Java EEで非常に基本的なライブラリアプリケーションを作成しています。このアプリケーションを使用すると、ユーザーは棚に関連付けられた本を追加できます。この関連付けは双方向で多対1であるため、本が所属する棚をbook.getShelf()
に、棚にはshelf.getBooks()
を含む書籍を手に入れることができると期待します。多対1の関係の読み込み
残念ながら、新しいBook
をShelf
に追加すると、この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
}
Book
とShelf
の持続性は、以下のステートレスセッション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>
<% }
%>
5年以上前に「J2EE」が「Java EE」にアップグレードされた、PSをどのように維持して、棚を再ロードし、トランザクションを管理するかを示す必要があります。 JPAの概念は全くありません。最新の状態にしてください)。 – BalusC
@BalusCお返事ありがとうございました。今すぐ見ることができるように、私はトランザクションを管理していません(おそらくそれは問題ですか?) – Ale