【发布时间】:2015-10-11 15:06:17
【问题描述】:
如何修复此错误以及在休眠中使用会话的最佳方法是在所有应用程序中使用一个会话和多个事务,或者我所做的很好,请检查下一个代码
我希望你用正确的代码给我答案,如果最好的话,如何在一个会话中完成它
这是错误
Exception in thread "AWT-EventQueue-0" org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:112)
at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateProxy(StatefulPersistenceContext.java:595)
at org.hibernate.engine.internal.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:642)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:90)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
休眠事务和实现
Session session = HibernateUtil.getSessionFactory().openSession();
Query query = null;
Transaction transaction = null;
@Override
public void delete(Car o) {
transaction = session.beginTransaction();
session.delete(o);
transaction.commit();
}
@Override
public List<Car> findAll() {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car");
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public Car findById(int id) {
query = session.createQuery("from Car where id=:id");
query.setParameter("id", id);
Car car = (Car) query.list().get(0);
return car;
}
@Override
public void insert(Car o) {
transaction = session.beginTransaction();
session.save(o);
transaction.commit();
}
@Override
public void update(Car o) {
transaction = session.beginTransaction();
session.update(o);
transaction.commit();
}
@Override
public List<Car> findByCarLicense(CarLicense carLicense) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where carLicense=:carLicense");
query.setParameter("carLicense", carLicense);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByPruCompany(PruCompany pruCompany) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where pruCompany=:pruCompany");
query.setParameter("pruCompany", pruCompany);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByTypy(String type) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where type=:type");
query.setParameter("type", type);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByModel(String model) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where model=:model");
query.setParameter("model", model);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByColor(String color) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where color=:color");
query.setParameter("color", color);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByNumber(String number) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where number=:number");
query.setParameter("number", number);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByKilos(Double kilos) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where kilos=:kilos");
query.setParameter("kilos", kilos);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public List<Car> findByAvalibity(String avalibity) {
List<Car> carsList = new ArrayList<Car>();
try {
query = session.createQuery("from Car where avalibity=:avalibity");
query.setParameter("avalibity", avalibity);
carsList = query.list();
for (Iterator iterator = carsList.iterator(); iterator.hasNext(); ) {
Car car = (Car) iterator.next();
}
} catch (HibernateException he) {
he.printStackTrace();
} finally {
}
return carsList;
}
@Override
public Car findByChassisNumber(String chassisNumber) {
query = session.createQuery("from Car where chassisNumber=:chassisNumber");
query.setParameter("chassisNumber", chassisNumber);
Car car = (Car) query.list().get(0);
return car;
}
和 HibernateUtil
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
SessionFactory sessionFactory = new Configuration().configure(
"/com/core/util/hibernate.cfg.xml").buildSessionFactory();
return sessionFactory;
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
【问题讨论】:
-
大多数情况下,您每次执行
transaction.commit时都应该关闭会话... -
这是正确的使用
transaction.commit并且我的方式是正确的 -
我尝试关闭会话仍然有错误
-
另一件事,是题外话,你想在你所有的
for()中做什么?就我所见,你什么也没做,你为什么不把它们删掉? -
如果我删除 'for()' 如何获取对象,请你能以最好的方式写这门课,谢谢
标签: java hibernate session transactions