2016-07-12 2 views
1

Я хочу использовать менеджер сущностей из контейнера, но когда я пытаюсь получить доступ к нему я получаюApache Karaf, не может вводить менеджер объект

java.lang.IllegalStateException: Нужна активная координация

persistence.xml

<persistence-unit name="data-point" transaction-type="JTA"> 
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=dvdrental)</jta-data-source> 
<properties> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect"/> 
    <property name="hibernate.show_sql" value="true"/> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
    <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
    <property name="hibernate.archive.autodetection" value="class"/> 
</properties> 

bluprint.xml

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd" 
     default-activation="eager" 
     xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.2.0" 
     xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0"> 

<jpa:enable /> 
<tx:enable-annotations /> 
<service id="filesEntityManager" ref="filesEntityManagerImpl" interface="ru.bia.karaf.dao.FilesEntityManager"/> 
<bean id="filesEntityManagerImpl" class="ru.bia.karaf.dao.FilesEntityManagerImpl"/> 
<bean id="testBean" class="ru.bia.karaf.web.TestBean" init-method="test"> 
    <property name="filesEntityManager" ref="filesEntityManagerImpl"/> 
</bean> 

TestBean.java

public class TestBean { 
    private FilesEntityManagerImpl filesEntityManager; 

    public void test(){ 
    System.out.println("hey bro from init"); 
    System.out.println("filesEntityManager = " + filesEntityManager); 
    System.out.println("filesEntityManager.getEm() = " + filesEntityManager.getEm()); 
} 

public FilesEntityManagerImpl getFilesEntityManager() { 
    return filesEntityManager; 
} 

public void setFilesEntityManager(FilesEntityManagerImpl filesEntityManager) { 
    this.filesEntityManager = filesEntityManager; 
    } 
} 

FilesEntityManagerImpl.java

@OsgiServiceProvider(classes = {FilesEntityManager.class}) 
@Transactional 
public class FilesEntityManagerImpl implements FilesEntityManager { 
    @PersistenceContext(unitName="data-point") 
    EntityManager em; 
... 
} 

ответ

1

EntityManager, который вводится в FilesEntityManagerImpl есть нить локальный прокси EntityManager. Его жизненный цикл связан с координацией.

Если вы обращаетесь к ним за пределами Координации, вы получаете эту ошибку. Вы можете убедиться, что координация активна, используя аннотации @Transactional. Если вам не нужна фактическая транзакция, а только Координация, то используйте @Transactional (TxType.SUPPORTS).

Вы также, как правило, не должны обращаться к EntityManager за пределами объекта, который его вводит.

+0

Это сработало, спасибо вам большое! –

Смежные вопросы