在应用jbpm四时, 如若没用运用spring构架, 就会经常出现LazyInitializationException.:42 | could not initialize proxy - no Session 这个异常, 实则, 这个重要是hibernate懒加载促成的
解决方案通常有以次形式,
一.在呼应的配置文件中配备lazy="false"
2. 在亟需预先,采取Hibernate.initialize()先头加载
3. 自各儿写阻截器处置.
至于一,这个是良好处置的, 这边就不说了.
关于3. 这个我临时还写糟糕.., 这个应该是和spring中的那个OpenSessionInViewFilter相仿的.
至于二, 这边就给个简略的事例来干说明
譬如说念, 经过historyActivityInstanceQuery失去HistoryTaskInstanceImpl,再由HistoryTaskInstanceImpl失去HistoryTask.
如若直接获取, 就会报LazyInitializationException异常.
可以经过以次模式取得
Java代码
// 测试事例
// list
HistoryActivityInstanceQuery haiQuery = new
HistoryActivityInstanceQueryImpl().executionId(piId);
List list = processEngine.get(CommandService.class).execute(
new ListLoadImmediately((AbstractQuery) haiQuery) {
private static final long serialVersionUID = 一L;
@Override
public void doLoad(HistoryActivityInstance datum) throws HibernateException {
if (datum instanceof HistoryTaskInstanceImpl) {
Hibernate.initialize(((HistoryTaskInstanceImpl) datum).getHistoryTask()); // 事前加载了
}
}
});
for (HistoryActivityInstance hai : list) {
if (hai instanceof HistoryTaskInstanceImpl) {
HistoryTaskInstanceImpl hti = (HistoryTaskInstanceImpl) hai;
System.out.println(">> " + hti.getHistoryTask().getAssignee());
}
}
// UniqueResult
haiQuery = new HistoryActivityInstanceQueryImpl().executionId(piId).page(零, 一);
HistoryActivityInstance ai= processEngine.get(CommandService.class).execute(
new UniqueLoadImmediately
((AbstractQuery) haiQuery) {
private static final long serialVersionUID = 一L;
@Override
public void doLoad(HistoryActivityInstance datum)
throws HibernateException {
if (datum instanceof HistoryTaskInstanceImpl) {
Hibernate.initialize(
((HistoryTaskInstanceImpl) datum).getHistoryTask());// 头里加载了
}
}
});
if (ai instanceof HistoryTaskInstanceImpl) {
System.out.println(">> " + ((HistoryTaskInstanceImpl) ai).getHistoryTask()
.getAssignee());
} else {
System.out.println("not an instance of HistoryTaskInstance");
}
// 输出
// >> 王总经理
// >> Sun Qi
// >> finance
// >> 张总
// >> 王总经理
// 测试事例
// list
HistoryActivityInstanceQuery haiQuery = new
HistoryActivityInstanceQueryImpl().executionId(piId);
List list = processEngine.get(CommandService.class).execute(
new ListLoadImmediately((AbstractQuery) haiQuery) {
private static final long serialVersionUID = 一L;
@Override
public void doLoad(HistoryActivityInstance datum) throws HibernateException {
if (datum instanceof HistoryTaskInstanceImpl) {
Hibernate.initialize(((HistoryTaskInstanceImpl) datum).getHistoryTask()); // 之前加载了
}
}
});
for (HistoryActivityInstance hai : list) {
if (hai instanceof HistoryTaskInstanceImpl) {
HistoryTaskInstanceImpl hti = (HistoryTaskInstanceImpl) hai;
System.out.println(">> " + hti.getHistoryTask().getAssignee());
}
}
// UniqueResult
haiQuery = new HistoryActivityInstanceQueryImpl().executionId(piId).page(零, 一);
HistoryActivityInstance ai= processEngine.get(CommandService.class).execute(
new UniqueLoadImmediately
((AbstractQuery) haiQuery) {
private static final long serialVersionUID = 一L;
@Override
public void doLoad(HistoryActivityInstance datum)
throws HibernateException {
if (datum instanceof HistoryTaskInstanceImpl) {
Hibernate.initialize(
((HistoryTaskInstanceImpl) datum).getHistoryTask());// 先头加载了
}
}
});
if (ai instanceof HistoryTaskInstanceImpl) {
System.out.println(">> " + ((HistoryTaskInstanceImpl) ai).getHistoryTask()
.getAssignee());
} else {
System.out.println("not an instance of HistoryTaskInstance");
}
// 输出
// >> 王总经理
// >> Sun Qi
// >> finance
// >> 张总
// >> 王总经理
ListLoadImmediately.java
Java代码
public abstract class ListLoadImmediately implements Command> {
private static final long serialVersionUID = 一L;
private AbstractQuery query;
public ListLoadImmediately(AbstractQuery query) {
this.query = query;
}
/* (non-Javadoc)
* @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)
*/
@Override
public List execute(Environment environment) throws Exception {
query.setCommandService(null); //
List data = doExecute(environment);
for (T datum : data) {
doLoad(datum);
}
return data;
}
/**
* 处置要加载的数据
*
* @param datum
* @throws HibernateException
*/
public abstract void doLoad(T datum) throws HibernateException;
@SuppressWarnings("unchecked")
public List doExecute(Environment environment) throws Exception {
return (List) query.execute(environment);
}
}
public abstract class ListLoadImmediately implements Command> {
private static final long serialVersionUID = 一L;
private AbstractQuery query;
public ListLoadImmediately(AbstractQuery query) {
this.query = query;
}
/* (non-Javadoc)
* @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)
*/
@Override
public List execute(Environment environment) throws Exception {
query.setCommandService(null); //
List data = doExecute(environment);
for (T datum : data) {
doLoad(datum);
}
return data;
}
/**
* 处置要加载的数据
*
* @param datum
* @throws HibernateException
*/
public abstract void doLoad(T datum) throws HibernateException;
@SuppressWarnings("unchecked")
public List doExecute(Environment environment) throws Exception {
return (List) query.execute(environment);
}
}
UniqueLoadImmediately.java
Java代码
/**
* @author yeyong
*/
public abstract class UniqueLoadImmediately implements Command {
private static final long serialVersionUID = 一L;
private AbstractQuery query;
public UniqueLoadImmediately(AbstractQuery query) {
this.query = query;
}
/* (non-Javadoc)
* @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)
*/
@Override
public T execute(Environment environment) throws Exception {
query.setCommandService(null); //
T data = doExecute(environment);
doLoad(data);
return data;
}
/**
* 处置要加载的数据
*
* @param data
* @throws HibernateException
*/
public abstract void doLoad(T data) throws HibernateException;
@SuppressWarnings("unchecked")
public T doExecute(Environment environment) throws Exception {
List list = (List) query.execute(environment);
if (list.isEmpty()) {
return null;
}
if (list.size() > 一) {
throw new JbpmException("result not unique: " + list.size());
}
return list.get(零);
}
}
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception
- 2196 - Application has generated an exception that could not be handled
- 2197 - [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket
- 2198 - java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
- 2199 - java.lang.IllegalStateException: getOutputStream() has already been called for this response
- 2200 - 异常嵌套
- 2201 - org.hibernate.HibernateException
- 2202 - java.io.FileNotFoundException
- 2203 - java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed
- 2204 - ORA-12560: TNS:protocol adapter error
- 2205 - org.jboss.deployment.DeploymentException
- 2206 - javax.naming.NamingException
- 2207 - 编译器错误信息: CS0433
- 2208 - java.lang.Error: 无法解析的编译问题
- 2209 - java.lang.NumberFormatException: For input string
- 2210 - java.net.BindException
- 2211 - org.xml.sax.SAXException
- 2212 - System.Data.OleDb.OleDbException: 找不到可安装的 ISAM
- 2213 - unknown software exception (0xc00000fd)
- 2214 - java.lang.IllegalAccessException
- 2215 - 在编译向该请求提供服务所需资源的过程中出现错误