java 非法尝试将代理与两个打开的会话相关联
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31551288/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
illegally attempted to associate a proxy with two open Sessions
提问by Alex Sifuentes
how fix this error and what best way to use sessions in hibernate are one session and multi transactions in all application or what i do is good please check next code
如何修复此错误以及在休眠中使用会话的最佳方法是所有应用程序中的一个会话和多个事务,或者我所做的很好,请检查下一个代码
and i hope you give me answer with correct code and how make it in one session if it best way
我希望你用正确的代码回答我,如果最好的话,如何在一个会话中完成它
this is error
这是错误
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)
the hibernate transactions and implements
休眠事务和实现
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;
}
and HibernateUtil
和 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();
}
回答by Alex Sifuentes
Try not to open your session
object for all your transactions, instead, open it and close it after everytime you use it, a minimal example taken from what you wrote:
尽量不要session
为所有交易打开您的对象,而是在每次使用它后打开并关闭它,这是您编写的一个最小示例:
public void delete(Car o) {
transaction = session.beginTransaction();
session.delete(o);
transaction.commit();
}
and
和
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;
}
Could be something like this:
可能是这样的:
public class Transactor {
public static void delete(Car o) {
Session session;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
} catch (HibernateException ex) {
session = HibernateUtil.getSessionFactory().openSession();
}
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.delete(o);
transaction.commit();
} catch (HibernateException ex) {
System.out.println("Error deleting car: " + ex);
if(transaction != null) {
transaction.rollback();
}
} finally {
if (session.isOpen()){
session.close();
}
}
}
public static List<Car> findAll() {
Session session;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
} catch (HibernateException ex) {
session = HibernateUtil.getSessionFactory().openSession();
}
List<Car> carsList = new ArrayList<>();
try {
carsList = session.createQuery("from Car").list();
} catch (HibernateException he) {
System.out.println("Error getting cars: " + he);
he.printStackTrace();
} finally {
if (session.isOpen()){
session.close();
}
}
return carsList;
}
}
I don't know if this is the best way, but is more secure.
我不知道这是否是最好的方法,但更安全。
EDIT
编辑
I have edited the example, if you want to try it, you could do something like this:
我已经编辑了示例,如果您想尝试一下,可以执行以下操作:
List<Car> carList = Transactor.findAll(); // get all cars
Transactor.delete(myCar); // delete an specific car
From here, you should be able to complete your class.
从这里,您应该能够完成您的课程。