4

我正在開發一個Spring/Hibernate/Vaadin應用程序,我有一個問題,即使進行了大量的研究,我仍然無法解決。 我的應用程序分爲四個層次:模型< - >庫< - >服務< - >查看Spring,Hibernate - TransactionException:已經有一個關聯的託管連接

當我在我的筆記本電腦,我沒有任何問題,當我嘗試顯示視圖我的申請。但是,當我把我的應用我的預生產服務器上,人們嘗試訪問測試,我在Tomcat的日誌中出現以下錯誤:

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) 

我認爲問題源於一個事實,即不同的用戶試圖訪問同一數據,但我不確定。 你們有沒有人遇到同樣的問題?

謝謝。

不要猶豫,如果你需要更多的代碼。

編輯

是的,我使用Spring Security,我注入我的倉庫在我的服務。一個典型的服務方法是:

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(); 
} 
+0

嗨沒有ü找到解決這一問題。請提出建議,因爲我也面臨着同樣的問題 – 2013-12-24 06:09:57

+0

我剛剛添加了解決方案作爲答案。 – c4k 2013-12-24 14:55:17

回答

2

問題出在@PersistenceContext批註中。我:

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

和我一起取代它:

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

你你的筆記本電腦和預生產服務器之間不同的應用服務器上運行?例如。你在你的筆記本電腦上使用Tomcat,但在預產品服務器上使用WebLogic,或類似的東西?如果是這樣,則差異可能在於DataSource bean的設置

相關問題