jbpm4中不施用Spring, LazyInitializationException的处置

在应用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值