我有一个用于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生命周期的每个阶段。以前有没有其他人遇到过这种情况?请帮帮忙。一直坚持到最后一天都没有成功。
发布于 2011-03-23 17:26:58
这不可能。通常不会有什么害处。Getter只是为了提供bean属性的访问点,而不是做一些业务工作。
如果您确实在该托管bean方法中调用了@EJB的getBook()方法,如下所示
public DataModel<BookModel> getBook() {
return new ListDataModel<BookModel>(bookService.getBook());
}这确实会很昂贵,因为它会在调用getter时多次调用DB。您希望在bean的构造函数或@PostConstruct中执行此工作。
@PostConstruct
public void init() {
book = new ListDataModel<BookModel>(bookService.getBook());
}另请参阅:
与具体问题无关的是,方法名称getBook()和变量名称book实际上并不是自文档化的,因为它实际上包含了多本书。我会用getBooks()和books代替。
https://stackoverflow.com/questions/5407453
复制相似问题