【问题标题】:HibernateException: Illegal attempt to associate a collection with two open sessionsHibernateException:非法尝试将集合与两个打开的会话相关联
【发布时间】:2015-05-04 11:28:03
【问题描述】:

这是我的桌子:

Orders.java

@Entity
public class Orders implements Serializable {

@Id
@GeneratedValue
private Integer id;
@Column(nullable = false)
private Date orderDate;
@ManyToOne(cascade = CascadeType.ALL)
private User user;

@OneToMany(mappedBy = "orders", cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
//getter/setters

我要从Orders表中删除一条记录:

OrderServiceImple.java:

@Transactional
public void deleteOrder(String oid) {
    Orders ordersToDelete = orderDao.findById(oid);
    System.out.println("orders To Delete: " + ordersToDelete); // retrieved correctly
    orderDao.delete(ordersToDelete); // exception is here
}

这是delete() 中的oderDaoImpl

OrderDaoImpl.java:

@Component
public class OrderDaoImpl implements OrderDao<Orders, Integer>, Serializable {

@Autowired
private SessionFactory sessionFactory;
private Session session;

public Session getSession() {
    session = sessionFactory.openSession();
    return session;
 }

public void delete(Orders entity) {
    getSession().delete(entity);
  }
}

我在delete() 中尝试了sessionFactory.getCurrentSession().delete(entity),但得到了同样的错误。

例外:

04-May-2015 15:49:18.929 WARNING [http-apr-8080-exec-2] null.null #{myCardBean.deleteOrder()}: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
 javax.faces.FacesException: #{myCardBean.deleteOrder()}: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
    at 

com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
Caused by: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
    at 
org.hibernate.collection.internal.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:633)

更新:

public Orders findById(String id) {
    Orders foundOrders = (Orders) getSession().get(Orders.class, Integer.parseInt(id)); // should be Integer
    return foundOrders;
}

【问题讨论】:

  • 实体类有什么奇怪的实现吗?
  • @StefanSteinegger 对不起,你的意思是什么?
  • 我的意思是 Orders 实体或其子实体中集合的 getter 或 setter 中的一些特殊代码。
  • @StefanSteinegger 我放了Ordes 实体。
  • 能否提供错误类型?

标签: hibernate session orm sql-delete


【解决方案1】:

在这两种方法中都使用SessionFactory 的内置currentsession()

findById(String id)delete(Orders entity)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2011-03-06
    • 2015-03-23
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多