我以primefaces页面为例(http://www.primefaces.org/showcase/ui/datatableLazy.jsf),它起了作用,但因为示例是在构造函数上加载列表,所以它并不是完全的延迟加载。我知道这是一个虚构的例子,所以我在我的bean上添加了以下几行
private LazyDataModel<Ficha> lazyListFichas;
我的初始化功能我把一些部分改成了这个
@PostConstruct
public void init() {
System.out.println("Inicializando fichas");
tienePadres=false;
fichaDM.setFicha(new Ficha());
//obtenerFichas();
//lazyListFichas = new FichaLazyList(fichaDM.getFichas);
lazyListFichas = new FichaLazyList();
}
我的FichaLazyList是这样的
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import ec.edu.puce.biologia.dao.FichaDao;
import ec.edu.puce.biologia.util.LazySorter;
@ViewScoped
public class FichaLazyList extends LazyDataModel <Ficha> {
private static final long serialVersionUID = 1L;
private List<Ficha> fichas=new ArrayList<Ficha>();
@EJB
private FichaDao fichaDao;
public FichaLazyList() {
}
public FichaLazyList(List<Ficha> fichas) {
this.fichas = fichas;
}
@Override
public Ficha getRowData(String rowKey) {
for(Ficha ficha : fichas) {
if(ficha.getIdFicha().equals(rowKey))
return ficha;
}
return null;
}
@Override
public Object getRowKey(Ficha ficha) {
return ficha.getIdFicha();
}
@Override
public List<Ficha> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
List<Ficha> data = new ArrayList<Ficha>();
//filter
fichas = fichaDao.encontrarPagina(first, pageSize);
if(fichas==null){
System.out.println("Lista nula");
}
for(Ficha ficha : fichas) {
boolean match = true;
for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
try {
String filterProperty = it.next();
String filterValue = filters.get(filterProperty);
String fieldValue = String.valueOf(ficha.getClass().getField(filterProperty).get(ficha));
if(filterValue == null || fieldValue.startsWith(filterValue)) {
match = true;
}
else {
match = false;
break;
}
} catch(Exception e) {
match = false;
}
}
if(match) {
data.add(ficha);
}
}
long total = fichaDao.contar();
System.out.println("xxx"+total);
//sort
if(sortField != null) {
Collections.sort(data, new LazySorter(sortField, sortOrder));
}
//rowCount
// int dataSize = data.size();
this.setRowCount((int) total);
//paginate
if(total > pageSize) {
try {
return data.subList(first, first + pageSize);
}
catch(IndexOutOfBoundsException e) {
return data.subList(first, first + ((int) total % pageSize));
}
}
else {
return data;
}
}
public List<Ficha> getFichas() {
return fichas;
}
public void setFichas(List<Ficha> fichas) {
this.fichas = fichas;
}
}
我得到这个错误,
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/catalogoBiologia].[Faces Servlet]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
at ec.edu.puce.biologia.model.FichaLazyList.load(FichaLazyList.java:55) [classes:]
第55行是这个吗
fichas = fichaDao.encontrarPagina(first, pageSize);
如果是viewscope还是session scope,当我尝试注入ejb时,我做错了什么
我认为问题不在于您的托管bean,问题在于您的模型EJB或Hibernate,因为fichas的值为null,因此fichaDao.encontrarPagina(first, pageSize)返回null检查fichaDao的代码和您的hibernate设置以连接到数据库。
谢谢Balusc,我只是在我的函数中用new调用它。我将value=“#{taxonomoniacontroller.lazyListFichas}”从我的数据表更改为value=“#{fichaLazyList}”,在我的脑海中,我没有将fichaLazyList视为bean,它是另一个类,无论如何解决了这个问题,我向fichaLazyList添加了@ManagedBean和@RequestScoped,我想它也可能是@viewScoped。在我看来,应该对其进行requestedscope处理,否则我会解决这个问题。我还将其添加到init函数中,这是使用异常类的另一种方法:
lazyListFichas=new LazyDataModel(){@Override public List load(int first,int pageSize,String sortField,SortOrder SortOrder,Map filters){
List<Ficha> lazyFicha = new ArrayList<Ficha>();
lazyFicha = servicioFicha.obtenerTodos(first, pageSize);
// populateLazyRandomCars(lazyFicha, pageSize);
return lazyFicha;
}
};
/**
* In a real application, this number should be resolved by a projection
* query
*/
lazyListFichas.setRowCount((int) servicioFicha.contarRegistrosTotal());
我有一个由Hibernate加载的ORM实体,当我需要时,会加载某些关联。该实体通过MQ传输到客户机应用程序(客户机是.NET,所以我使用MessagePack来序列化/反序列化),当实体被MsgPack序列化时,它试图访问惰性加载的关联,但失败了,因为会话已经关闭。即使它没有失败,我也不希望它在某些情况下加载关联。 是否有一种方法告诉hibernate使用空值而不是某些查询结果的代理来填充惰性关
我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。 为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。 到目前为止我所做的... 这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。 我尝试从实体中删除接口和字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得消息,并且默认情况下返回到急切加载。 我是不是
这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept
我试图在primefaces数据表设置中实现延迟加载。目前,在没有延迟加载实现的情况下,这是可行的,但是在实现延迟加载后,我在datatable中没有得到任何数据。但是,我可以在我的LoadData方法中打印我的列表,以验证数据是否正在加载到我的列表中,但一旦返回我的LazyModel并尝试加载datatable,似乎就会出现问题。这可能只是我忽略的一些简单的事情。非常感谢您的帮助! 这是我的屏幕
那么,如何惰性加载一个单例,同时防止它受到这种攻击呢?(我知道“enum”模式,但有些人认为它实际上是一种黑客攻击。查看关于这个公认答案的评论:这个单例是否同时抵抗序列化和反射攻击?顺便说一句,我的问题不同)。 编辑:我认为在DCL的情况下可以通过使用静态计数器字段、基于类的同步构造函数并将“this”分配给静态成员来防止它。但是,不知道如何防止它的情况下持有者成语。
问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请