I am developing a Spring / Hibernate / Vaadin application and I have a problem that I could not solve, despite a lot of research. My application is organized in four layers: model ↔ repository ↔ service ↔ view
When I am on my laptop, I have no problem when I try to display representations of my application. But when I put my application on my pre-server, people try to access for testing, and I have the following error in Tomcat logs:
Caused by: org.springframework.orm.jpa.JpaSystemException: org.hibernate.TransactionException: Already have an associated managed connection; nested exception is javax.persistence.PersistenceException: org.hibernate.TransactionException: Already have an associated managed connection at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:311) at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect$1$18a1ac9(JpaExceptionTranslatorAspect.aj:15) at com.code.repositories.jpa.SuperRepository.findAll(SuperRepository.java:99) at com.code.service.ActorService.findAllAddressTypes(ActorService.java:103) at com.code.views.vaadin.views.contact.AddressTypeView.buildLayout(AddressTypeView.java:50) at com.code.views.vaadin.layout.objects.CodeView.<init>(CodeView.java:29) at com.code.views.vaadin.views.AbstractEntityView.<init>(AbstractEntityView.java:25) at com.code.views.vaadin.views.contact.AddressTypeView.<init>(AddressTypeView.java:31) ... 65 more Caused by: javax.persistence.PersistenceException: org.hibernate.TransactionException: Already have an associated managed connection at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288) at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1370) at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.enlistInCurrentTransaction(ExtendedEntityManagerCreator.java:421) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.doJoinTransaction(ExtendedEntityManagerCreator.java:398) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:356) at $Proxy285.createNamedQuery(Unknown Source) ... 71 more Caused by: org.hibernate.TransactionException: Already have an associated managed connection at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:65) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160) at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1309) at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:57)
I think the problem is that different users are trying to access the same data, but I'm not sure. Did any of you have the same problem?
Thanks.
Feel free if you need more code.
EDIT
Yes I use Spring Security, I inject my repositories into my services. Typical Maintenance Method:
AddressTypeView
@Resource private ActorService actorService; private BeanItemContainer<AddressType> container; private EntityList list; private AddressTypeForm form; public void buildLayout() { super.buildLayout(); container = new BeanItemContainer<AddressType>(AddressType.class); container.addAll(actorService.findAllAddressTypes()); list = new EntityList(); list.addActionHandler(new EntityListActionHandler(this)); list.setContainerDataSource(container); list.setVisibleColumns(AddressType.TABLE_FIELDS); list.setColumnHeaders(list.getColumnHeaders()); form = new AddressTypeForm(container); list.addListener(new ItemClickEvent.ItemClickListener() { private static final long serialVersionUID = 1L; @Override public void itemClick(ItemClickEvent event) { AddressType selected = (AddressType) event.getItemId(); form.setItemDataSource(new BeanItem<AddressType>(selected)); form.setImmediate(true); } }); VerticalSplitPanel panel = new VerticalSplitPanel(); panel.setFirstComponent(list); panel.setSecondComponent(form); getVerticalLayout().addComponent(toolBar); getVerticalLayout().addComponent(panel); getVerticalLayout().setExpandRatio(panel, 1); }
ActorService
public List<AddressType> findAllAddressTypes() { return addressTypeRepository.findAll(); }
AdressTypeRepository
@SuppressWarnings("unchecked") @Override @Transactional public List<T> findAll() { Query query = this.entityManager.createNamedQuery(this.entityClass.getSimpleName() + ".findAll"); return query.getResultList(); }
source share