org.apache.struts2.json.JSONException:org.hibernate.LazyInitializationException:懒得初始化一个集合

我从jsp url: "ProductByName"调用自动完成url: "ProductByName" 。 在控制台中响应它显示

 POST http://localhost:8082/Store/SingleProduct 500 (Internal Server Error) 

在jsp中

  $(".name").autocomplete({ source: function(request, response) { $.ajax({ url: "ProductByName", dataType: "json", data: { str: request.term, maxRows: 5 },... 

struts.xml

   productList\[\d+\]\.id, productList\[\d+\]\.name, productList\[\d+\]\.description  true   

我想只获取productList几个属性

在Action类中

 public class ProductDetailsAction extends ActionSupport { private long id; private String barCode;//bardoce private String name; private String desc; private long quantity; private float unitPrice; private float sellingPrice; private float totalSellingPrice; private long clientId; private ArrayList BillList; private Date startDate; private Date endDate; private int discountPercentage; private Timestamp addDate; private String dataStatus; private ArrayList productList; private ArrayList productBillList; public String fetchByProductName() { ProductDetailsBusiness pdb = new ProductDetailsBusiness(); Map data = pdb.fetchByProductName(getName()); setProductList((ArrayList) data.get("list")); return SUCCESS; } //other methods and getter and setter } 

我得到以下exception

 SEVERE: Exception occurred during processing request: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246) at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178) at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168) at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134) at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:102) at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:116) at org.apache.struts2.json.JSONResult.createJSONString(JSONResult.java:197) at org.apache.struts2.json.JSONResult.execute(JSONResult.java:171) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:744) Caused by: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246) at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178) at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168) at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134) at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390) at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231) ... 71 more Caused by: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246) at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178) at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168) at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134) at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390) at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231) ... 76 more Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: iland.hbm.Client.billDetailses, no session or session was closed at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) at org.hibernate.collection.PersistentSet.equals(PersistentSet.java:429) at java.util.Vector.indexOf(Vector.java:408) at java.util.Vector.contains(Vector.java:367) at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:117) at org.apache.struts2.json.JSONWriter.add(JSONWriter.java:390) at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:231) ... 81 more 

编辑: fetchByProductName(getName()); 方法只包含Jdbc代码。 那为什么Hibernate Errorrs ??

我从数据库中获取日期并在控制台上打印。 在成功之前我给了System.out.println(在行动中); 这是aslo打印正确它不必从数据库访问数据,然后为什么failed to lazily initialize a collection of XXX如何解决这个问题。

编辑

  public class ProductDetailsBusiness { ProductDetailsAction pda = null; PreparedStatement ps = null; ResultSet rs = null, res = null; Connection con = null; String status = null; ArrayList ar = null; public Map fetchByProductName(String name, long cid) { System.out.println(" ProductBusiness fetchByProductName()"); status = "success"; System.out.println("Name is " + name); ar = new ArrayList(); con = ConnectionFactory.getConnection(); try { String query = "select * from product " + "where status=? and cid=? " + "order by add_date"; ps = con.prepareStatement(query); ps.setString(1, "active"); ps.setLong(2, cid); System.out.println("Before execution"); res = ps.executeQuery(); System.out.println("Details are"); while (res.next()) { pda = new ProductDetailsAction(); long id1 = res.getLong("id"); String barCode = res.getString("barcode"); String name1 = res.getString("name"); String desc = res.getString("description"); long quntity = res.getLong("quntity"); float unit_price = res.getLong("unit_price"); float selling_price = res.getLong("selling_price"); int discount_percent = res.getInt("discount_percent"); pda.setId(id1); pda.setBarCode(barCode); pda.setName(name1); pda.setDesc(desc); pda.setQuantity(quntity); pda.setUnitPrice(unit_price); pda.setSellingPrice(selling_price); pda.setDiscountPercentage(discount_percent); System.out.println("id "+id1+" name "+name1+" "+desc); ar.add(pda); } con.close(); } catch (SQLException s) { status = "failure"; System.out.println("SQL code does not execute." + s); } finally { try { if (con != null) { con.close(); } } catch (SQLException sqe) { status = "failure"; System.out.println("SQLException " + sqe); } } Map m = new HashMap(); m.put("status", status); m.put("list", ar); return m; } //other methods } 

还更新了动作类请同时查看

JSON的序列化过程由JSON结果控制,该结果是您在项目中使用的JSON插件的一部分。 并且您已经知道要限制序列化程序使用的属性,您应该使用json结果的includeProperties 。 还应该检查root属性。 如果未指定,则json结果默认使用值堆栈的top对象。 如果您的操作是模型驱动的,那么模型会覆盖操作 。 因此,您在JSONWriter使用的正则表达式适用于模型对象,而作为JSONWriter序列化JSONWriter使用BeanInfo来提取bean的属性。 首先,检查这些属性是否存在@JSON注释,如果它有serialize=false ,则跳过它,否则包含它。 这样,您可以通过在不会序列化为JSON的属性(例如@OneToMany属性等)上添加注释来控制序列化过程。然后检查excludePropertiesexcludeProperties是否为空。 此时您应该确认,如果您没有与指定模式匹配的属性,那么它们将不会被序列化。 所以,让我们转到LazyInitializationException ,正如我所说,如果你在模型层次结构中有@JSON注释,你应该在其中放置serialize=false ,因为默认情况下它是true

 @JSON(serialize=false) public Object getBillDetailses(){ return billDetailses; } 

你在action类中说了你的productList ,那么你应该配置结果

    ^productList\[\d+\]\.id, ^productList\[\d+\]\.name, ^productList\[\d+\]\.description   #action   

注意, ^表示开始表达式,因此仅包含动作属性。

LazyInitializationException是此问题的根本原因,当Struts 2 json插件尝试序列化您的productList对象时抛出该问题。 根据例外文件

(它)表示访问会话上下文之外的未获取数据。 例如,在会话关闭后访问未初始化的代理或集合时。

这意味着您正在尝试访问从数据库中以java的forms加载hibernate代理forms的billDetailses实体的集合。 按照hibernate 文档

如果在Session的范围之外访问未初始化的集合或代理,即当拥有集合或具有对代理的引用的实体处于分离状态时,Hibernate将抛出LazyInitializationException。

所以这意味着billDetailses list集合未初始化,您可以在使用之前强制初始化

 Hibernate.initialize(data) // collection entity 

在集合映射上设置FetchType.EAGER也解决了这个问题,但是它会添加到billDetailses对象,因为每次在java中加载这个对象时它的集合都会被强制加载,从我的考虑就像购买法拉利并且总是在第一次运行它齿轮。

如果你经常得到LazyInitializationException我建议尝试使用OpenSessionInViewFilter ,它可以让你的hibernate会话从请求开始打开,直到你的应用程序完成响应。