在我当前的 spring 项目中,当我的应用程序尝试执行此方法时:
public void setPedido(Cliente current) {
Pedido novo = new Pedido();
novo.setData(new Date());
novo.setListaDeProdutos(current.getCestaDeCompras());
pedido.insert(novo);
if(current.getListaDePedidos() == null)
current.setListaDePedidos(new ArrayList<Pedido>());
current.getListaDePedidos().add(novo);
current.getCestaDeCompras().clear();
cliente.update(current);
}
我得到了这个错误:
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)
at org.hibernate.event.internal.WrapVisitor.processCollection(WrapVisitor.java:66)
at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:121)
at org.hibernate.event.internal.WrapVisitor.processValue(WrapVisitor.java:125)
at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
at org.hibernate.event.internal.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:372)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:273)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344)
at com.sun.proxy.$Proxy79.persist(Unknown Source)
at org.store.generic.persistence.Dao.insert(Dao.java:29)
at org.store.generic.persistence.Dao$$FastClassBySpringCGLIB$$ac46d9f5.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
我的Dao类(插入方法的位置)是这样的:
public class Dao<E> {
@Autowired
private EntityManagerFactory factory;
protected Class<? extends Model> clazz;
public Dao(Class<? extends Model> clazz) {
this.clazz = clazz;
}
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
public void insert(E object) {
EntityManager entityManager = getEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();
}
...
}
我还尝试在Dao类中的insert、update和delete方法以及在服务类中使用它们的方法中添加注释@Transaction,但同样的问题也会发生。
有人能看出我做错了什么吗?
ps.:我试图保存的实体类是:
@Entity
public class Pedido extends Model {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Order(value = 1)
private Integer id;
@Order(value = 2)
private Date data;
@ManyToMany
@JoinTable(name="listaDeProdutos", joinColumns={@JoinColumn(name="fk_pedido")}, inverseJoinColumns={@JoinColumn(name="fk_produto")})
@LazyCollection(LazyCollectionOption.FALSE)
@Order(value = 3)
private List<Produto> listaDeProdutos;
}
好的,实际上生成此错误的问题是由于 Dao 类的方法中缺少 close() 指令。我将代码修改为:
public void insert(E object) {
EntityManager entityManager = getEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();
entityManager.close();
}
现在一切正常。
我在Hibernate4中使用JTA事务管理器。有人知道这个问题吗?在执行刷新时,我面临错误。 下面是我面临上述问题的一段代码。 XML:
我使用Hibernate和Spring,我在执行以下代码时得到这个异常: 我已经阅读了一些关于Hibernate的会话管理,我有一种预感,这段代码的会话处理很差。举行两次公开会议的原因可能是什么?Hibernate API表示函数返回一个新的会话对象或现有的会话对象。在这种情况下,它从哪里获取现有会话对象?如果它创建了一个新的会话对象,那么处理所涉及的集合仍然可以吗? 任何帮助将不胜感激。提前感谢
我试图更新MySql数据库中的记录。更新时引发了以下异常 我检查会话。它关闭在每个方法的最后块中。无法弄清楚出了什么问题。我能够毫无问题地使用其他方法插入更新操作,但只有保存更新用户豆方法抛出异常 UserDAOImpl: 服务输入: applicationContext.xml: 我能够使用相同的配置执行所有数据库操作,但当我从serviceImpl调用块用户()方法时,它调用DAO方法,并且S
我在我的单元测试中看到了上面的错误,并且不知道如何纠正它。 我的单元测试类扩展了abstracttransactiondatasourcespringcontexttests并执行以下操作: 下面是我的规则组映射文件的一个片段。如您所见,RuleGroup封装了规则和属性集合,默认情况下这两者都是延迟加载的: 我的DAO类扩展了HibernateDaoSupport: 通过调试我的测试,在find
那么,除了避免使用jackson-hibernate-mapper进行测试之外,还有什么方法可以避免这个问题吗?使用DTO和Dozer代替domain object不被认为是一种解决方案(将来会这样做,但不是现在)。 提前致谢
问题内容: 我有一个问题,它给我错误: 无法创建sessionFactory object.org.hibernate.AnnotationException:非法尝试将非集合映射为@ OneToMany,@ ManyToMany或@CollectionOfElements:nl.scalda.pasimo.model.employeemanagement.EducationTeam.coachG