[英]Hibernate org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
[英]org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection
我从jsp 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
<action name="ProductByName" class="iland.productdetails.ProductDetailsAction" method="fetchByProductName">
<result type="json">
<param name="includeProperties">productList\[\d+\]\.id,
productList\[\d+\]\.name,
productList\[\d+\]\.description
</param>
<param name="excludeNullProperties">true</param>
</result>
</action>
我只想获取productList
几个属性
行动课
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<BillDetails> BillList;
private Date startDate;
private Date endDate;
private int discountPercentage;
private Timestamp addDate;
private String dataStatus;
private ArrayList<ProductDetailsAction> productList;
private ArrayList<Product> 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
}
我正在关注异常
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代码。 那么为什么要使用休眠错误器呢?
我正在从数据库中获取日期,也正在控制台上打印。 在成功之前,我给了System.out.println(
In action );
这是正确的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<ProductDetailsAction> 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
}
还更新了动作课程,请同时查看
LazyInitializationException
是此问题的根本原因,当Struts 2 json插件尝试序列化productList
对象时,将引发此问题。 根据例外文件
(它)指示访问会话上下文之外的未提取数据。 例如,当关闭会话后访问未初始化的代理或集合时。
这意味着您正在尝试访问billDetailses
实体的集合, billDetailses
实体以数据库中的Java休眠代理的形式加载。 根据休眠文件
如果在Session范围之外访问未初始化的集合或代理,即当拥有该集合或对该代理的引用的实体处于分离状态时,Hibernate将抛出LazyInitializationException。
因此,这意味着未初始化billDetailses
list
集合,您可以在完成操作之前使用强制强制初始化
Hibernate.initialize(data) // collection entity
在集合映射上设置FetchType.EAGER
也可以解决该问题,但是它将每次添加到billDetailses
对象中,因为每次将此对象加载到Java中时,都会强制加载其集合,而从我的角度来看,这就像购买Ferrari并始终在第一时间运行齿轮。
如果您经常收到LazyInitializationException
我建议尝试使用OpenSessionInViewFilter
,它可以使休眠会话从请求开始就保持打开状态,直到从应用程序完成响应为止。
JSON的序列化过程由JSON结果控制,JSON结果是您在项目中使用的JSON插件的一部分。 而且您已经知道,要限制序列化程序使用的属性,您应该使用json
结果的includeProperties
。 还有一个root
属性,您应该检查。 如果未指定,则json结果默认使用值堆栈的top
对象。 如果您的操作是模型驱动的,那么模型将覆盖action 。 所以,你在使用的正则表达式includeProperties
应用于模型对象,串行这是JSONWriter
使用BeanInfo
提取bean的属性。 首先,检查这些属性是否存在@JSON
批注,如果它具有serialize=false
,则将其跳过,否则将包括在内。 这样,您就可以通过把注解,你不会序列化JSON等属性控制序列化过程@OneToMany
性能等,然后includeProperties
或excludeProperties
如果他们不为空进行检查。 此时,您应该确认,如果您没有与指定模式匹配的属性,那么它们将不会被序列化。 因此,让我们转到LazyInitializationException
,就像我说的那样,如果模型层次结构中曾经有@JSON
注释,则应在其中放置serialize=false
,因为默认情况下为true
。
@JSON(serialize=false)
public Object getBillDetailses(){ return billDetailses; }
您在操作类中说了productList
,那么您应该配置结果
<!-- Result config -->
<result type="json">
<param name="includeProperties">
^productList\[\d+\]\.id,
^productList\[\d+\]\.name,
^productList\[\d+\]\.description
</param>
<param name="root">
#action
</param>
</result>
注意, ^
代表表达式的开头,因此仅包含动作属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.