загрузка отношения многие-к-одному - PullRequest
0 голосов
/ 16 декабря 2011

Я пишу очень простое библиотечное приложение в Java EE, просто чтобы понять, как оно работает.Это приложение позволяет пользователю добавить книгу, которая связана с полкой.Ассоциация является двунаправленной, многие-к-одному, поэтому я ожидаю, что смогу получить полку, к которой принадлежит книга book.getShelf(), и книги, которые содержат полку shelf.getBooks().

К сожалению, если я добавлю новый 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 - этоуправляемый следующим сессионным компонентом без сохранения состояния, BookManager.Он также содержит метод для получения списка книг на полке (getBooksInShelf).

@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: (я пишу только часть кода для представления книги)

<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>
<%  } 
%>

1 Ответ

1 голос
/ 06 декабря 2012

Вы должны поддерживать двунаправленные отношения. Когда вы создаете новую Книгу и устанавливаете ее Полку, вы должны добавить Книгу в книги Полки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...