当一个表与另一个表有外键相连时,使用hibernate得到的对象(实际是从数据库中取得的一系列数据),然后再用json格式传给前端并使用extjs显示时,如果直接使用hibernate后,会出现如下问题:
15312 [http-80-Processor25] ERROR hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.base.model.Switch.ifInterfaces, no session or session was closed
原因就是二者在对外键相连的表操作的配合上存在问题,补救的解决方法是在用hibernate得到对象列表后,再重新赋值转一下就可以了,当然这样代码就不好看了,但是没有办法,如下所示:
如果直接这样写不行:
public List<Switch> getAllSwitches(String firstResult, String maxResult) throws Exception {
List<Switch> list = new ArrayList<Switch>();
Session session = hibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
List<Switch> switches =session.createCriteria(Switch.class).add(Restrictions.between("id",Long.parseLong(firstResult), Long.parseLong(maxResult))).list();
//String sql = "select * from switch limit " + firstResult + "," + maxResult ;
//List<Switch> switches = session.createSQLQuery(sql).addEntity(Switch.class).list();
transaction.commit();
return switches;
需要进行如下操作:
public List<Switch> getAllSwitches(String firstResult, String maxResult) throws Exception {
List<Switch> list = new ArrayList<Switch>();
Session session = hibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
String sql = "select * from switch limit " + firstResult + "," + maxResult ;
List<Object[]> temp = session.createSQLQuery(sql).list();
for(Object[] obj : temp){
Switch switch1 = new Switch();
switch1.setId(Long.valueOf(obj[0].toString()));
if(obj[1]!=null){
switch1.setIpAddress(obj[1].toString());
}
if(obj[2]!=null){
switch1.setSaviStatus(Integer.valueOf(obj[2].toString()));
}
if(obj[3]!=null){
switch1.setMaxDadDelay(Integer.valueOf(obj[3].toString()));
}
if(obj[4]!=null){
switch1.setMaxDadPrepareDelay(Integer.valueOf(obj[4].toString()));
}
if(obj[5]!=null){
switch1.setMaxSlaacLife(Integer.valueOf(obj[5].toString()));
}
if(obj[6]!=null){
switch1.setLinkDownDelay(Integer.valueOf(obj[6].toString()));
}
if(obj[7]!=null){
switch1.setCommunityName(obj[7].toString());
}
if(obj[8]!=null){
switch1.setSNMPVersion(obj[8].toString());
}
list.add(switch1);
}
tx.commit();
}catch(Exception e){
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
throw e;
}
return list;
}