如何在抽象类中获取OSGI中的EntityManager?(如spring @PersistenceContext)

时间:2016-03-04 06:02:17

标签: java jpa osgi entitymanager

我尝试创建BaseDao并向其注入EntityManager。在春天我做了这个:

public abstract class BaseJpaDao<E> implements BaseDao<E>{
    protected Class<?> entityClass;

    @PersistenceContext(unitName = "access")
    protected EntityManager entityManager;

    public BaseJpaDao(Class<?> entityClass) {
        this.entityClass = entityClass;
    }

    @Override
    public E persist(E e) {
        entityManager.persist(e);
        return e;
    }

但是现在我尝试在OSGI中制作它,我不明白它是怎么做的。我treid写在blueprint.xml

<bean id="baseJpaDao" class="domain.access.impl.BaseJpaDao" >
    <jpa:context unitname="access" property="entityManager"/>
    <tx:transaction method="*" value="RequiresNew"/>
</bean>

之后

public abstract class BaseJpaDao<E> implements BaseDao<E>{
    protected Class<?> entityClass;

    private EntityManager entityManager;

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public BaseJpaDao(Class<?> entityClass) {
        this.entityClass = entityClass;
    }

    @Override
    public E persist(E e) {
        entityManager.persist(e);
        return e;
    }

我喜欢this link

但没有帮助。

我试过这个

EntityManagerFactory emf = Persistence.createEntityManagerFactory("access", System.getProperties());
        em = emf.createEntityManager();

但没有帮助。

1 个答案:

答案 0 :(得分:1)

在Aries JPA 1.x中无效。

在Aries JPA 2.x中,您可以使用与spring中完全相同的代码。见TaskServiceImpl.java。您只需要将jpa:enable and jta:enable elements添加到您的蓝图上下文以激活功能。

或者,您可以使用blueprint-maven-plugin从注释生成整个blueprint.xml。顺便说一下版本1.3.0应该没问题。您不需要快照。

感谢您的配置片段。问题是你为jpa使用了错误的命名空间。试试这些:

xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0"
xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.2.0"