Spring, Hibernate - TransactionException: уже есть связанное управляемое соединение - PullRequest
4 голосов
/ 20 марта 2012

Я разрабатываю приложение Spring / Hibernate / Vaadin, и у меня есть проблема, которую я не смог решить, несмотря на множество исследований. Мое приложение состоит из четырех слоев: модель <-> хранилище <-> служба <-> вид

Когда я на своем ноутбуке, у меня нет проблем, когда я пытаюсь отобразить виды моего приложения. Но когда я помещаю свое приложение на подготовительный сервер, люди пытаются получить доступ к тестированию, и в журналах 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)

Я думаю, что проблема в том, что разные пользователи пытаются получить доступ к одним и тем же данным, но я не уверен. У кого-нибудь из вас была такая же проблема?

Спасибо.

Не стесняйтесь, если вам нужно больше кода.

EDIT

Да, я использую 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();
}

Ответы [ 2 ]

2 голосов
/ 24 декабря 2013

Проблема была в аннотации @PersistenceContext.У меня было:

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

, и я заменил его на:

@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private EntityManager entityManager;
0 голосов
/ 24 декабря 2013

Работали ли вы на другом сервере приложений между вашим ноутбуком и подготовительным сервером?Например, вы используете Tomcat на своем ноутбуке, но используете WebLogic на сервере pre-prod или что-то в этом роде?Если это так, разница может быть в настройке компонента DataSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...