jbpm4中不施用Spring, LazyInitializationException的处置

来源:互联网 发布:易语言取网页源码 编辑:程序博客网 时间:2024/06/11 17:10

在应用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 - 在编译向该请求提供服务所需资源的过程中出现错误
  • 原创粉丝点击