JSF 2 Lifecycle - PullRequest
       49

JSF 2 Lifecycle

2 голосов
/ 23 марта 2011

У меня есть этот код для BookModel.java:

@Entity
@Table(name = "BOOK")
@NamedNativeQuery(name = "BookModel.findBookTitle", query = "SELECT @rownum:=@rownum+1 'no', m.title, m.author, REPLACE(SUBSTRING_INDEX(m.content, ' ', 30), '<br>', ' '), m.viewed, m.hashid FROM book m, (SELECT @rownum:=0) r WHERE m.title like 'a%'")
public class BookModel implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ_GEN")
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "title")
    private String title;

    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "author")
    private String author;
}   

И BookService.java для бизнес-уровня:

@Stateless
public class BookService
{
    @SuppressWarnings("unchecked")
    public List<BookModel> getBook() {
       Query query = entityManager.createNamedQuery("BookModel.findBookTitle");
       List<BookModel> result = query.getResultList();
       return result;
    }
 }

И BookBean.java для уровня презентации:

@ManagedBean(name = "BookBean")
@RequestScoped
public class BookBean implements Serializable
{
    @EJB
    private BookService bookService;
    private DataModel<BookModel> book;

    public DataModel<BookModel> getBook() {
       return book;
    }
}   

И на странице book.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.prime.com.tr/ui">
    <p:dataTable id="bookList" value="#{BookBean.book}" var="book">
    ...
    </p:dataTable> 
 </html>

У меня вопрос: как я могу ограничить метод getBook () в BookBean должен выполняться только один раз вместо шести - предположительно для каждой фазы жизненного цикла JSF.Кто-нибудь еще сталкивался с этим раньше?Пожалуйста помоги.Застряли в этом в последний день безуспешно.

1 Ответ

2 голосов
/ 23 марта 2011

Это невозможно. Обычно это не должно причинять вреда. Геттеры предназначены исключительно для предоставления точек доступа к свойствам бинов, а не для выполнения каких-либо бизнес-задач.

Если вы вызывали метод @EJB s getBook() внутри этого метода управляемого компонента, как показано ниже

public DataModel<BookModel> getBook() {
   return new ListDataModel<BookModel>(bookService.getBook());
}

тогда это действительно будет дорого, так как это вызовет БД столько раз, сколько вызывается геттер. Вы хотели бы выполнить эту работу в конструкторе компонента или вместо @PostConstruct.

@PostConstruct
public void init() {
    book = new ListDataModel<BookModel>(bookService.getBook());
}

Смотри также:


Вне зависимости от конкретной проблемы, имя метода getBook() и имя переменной book на самом деле не являются самодокументируемыми, поскольку на самом деле содержит более одной книги. Я бы использовал getBooks() и books вместо.

...