У меня есть этот служебный компонент:
@Stateless
public class BookService
{
@PersistenceContext(unitName="persistentUnit")
protected EntityManager entityManager;
public BookModel find(Long id) {
return entityManager.find(BookModel.class, id);
}
}
А базовый компонент страницы Facelet:
@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
@EJB
private BookService bookService;
@ManagedProperty(value="#{param.id}")
private Long id;
private DataModel<BookModel> books;
private BookModel currentBook;
@PostConstruct
public void init() {
if (id == null) {
// UPDATE: Retrieve a list of books.
} else {
// UPDATE: id shouldn't be null here.
// Get detail info about a book using the id
currentBook = bookService.find(id);
}
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BookModel getCurrentBook() {
return currentBook;
}
public void setCurrentBook(BookModel currentBook) {
this.currentBook = currentBook;
}
}
Почему значение id
всегда возвращает ноль, хотя URL-адрес возвращается как bookedit.jsf?id=5418
Я не понимаю этого.
Кроме того, я считаю метод EntityManager#find
довольно ограничительным, поскольку он принимает в качестве второго параметра только значение первичного ключа. Что делать, если я хочу передать значение [хеш-код] вместо первичного ключа. Как я могу сделать это с помощью метода EntityManager#find
?
P.S. Я заметил, что требование EntityManager#find
одинаково для реализаций OpenJPA и EclipseLink. Хм ...