2016-07-12 16 views
1

injizieren möchte ich Entity Manager aus dem Behälter verwenden, aber wenn ich versuche, es erhalte ich Zugriff aufApache Karaf kann nicht Entity Manager

java.lang.IllegalStateException: Need aktive Koordination

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; 
... 
} 

Antwort

1

Die EntityManager die in FilesEntityManagerImpl injiziert wird, ist ein Thread lokale Proxy des EntityManager. Ihr Lebenszyklus ist an eine Koordination gebunden.

Wenn Sie außerhalb einer Koordination auf em zugreifen, erhalten Sie diesen Fehler. Sie können sicherstellen, dass eine Koordination aktiv ist, indem Sie die @Transactional-Annotationen verwenden. Wenn Sie keine tatsächliche Transaktion aber nur die Koordination benötigen, dann verwenden Sie @Transactional (TxType.SUPPORTS).

Sie sollten im Allgemeinen nicht auf den EntityManager außerhalb des Objekts zugreifen, das mit ihm injiziert wird.

+0

Es hat funktioniert, vielen Dank! –