Spring, Hibernate - TransactionException: There is already a linked managed connection

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; /** * Build layout */ 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

 /** * Find all address types * @return */ 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(); } 
+4
source share
2 answers

The problem was the @PersistenceContext annotation. I have had:

 @PersistenceContext(type = PersistenceContextType.EXTENDED) private EntityManager entityManager; 

and I replaced it with:

 @PersistenceContext(type = PersistenceContextType.TRANSACTION) private EntityManager entityManager; 
+2
source

Have you worked on different application servers between your laptop and the pre-production server? For instance. are you using tomcat on your laptop but using weblogic on the pre-prod server or something like that? If so, the difference may be in setting up the DataSource bean

0
source

Source: https://habr.com/ru/post/1402430/


All Articles