首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >能够在Seam3中@Inject的配置

能够在Seam3中@Inject的配置
EN

Stack Overflow用户
提问于 2012-01-07 03:11:56
回答 1查看 9K关注 0票数 3

在我的项目中,我使用了Seam 3,并且在使用@Inject注解注入EntityManager时遇到了问题。我非常肯定会有某种配置来确保EnityManager知道要使用哪个PersistenceUnit。例如,对于EJB,您可以键入:

代码语言:javascript
复制
@PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME")
private EntityManager eManager;

哪个持久性单元是在persistence.xml文件中配置的。下面是我的伪配置:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="MY_PERSISTENCE_UNIT_NAME" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/TimeReportDS</jta-data-source>
        <mapping-file>META-INF/orm.xml</mapping-file> 

        <class>....</class>
        <class>....</class>
        <class>....</class>

        <properties>

            <property name="jboss.entity.manager.factory.jndi.name"
                value="java:/modelEntityManagerFactory" />

            <!-- PostgreSQL Configuration File -->
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.connection.password" value="password" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://192.168.2.125:5432/t_report" />
            <property name="hibernate.connection.username" value="username" />

            <!-- Specifying DB Driver, providing hibernate cfg lookup
                 and providing transaction manager configuration -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.JBossTransactionManagerLookup" />
            <property name="hibernate.archive.autodetection" value="class" />

            <!-- Useful configuration during development - developer can see structured SQL queries -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />

        </properties>
    </persistence-unit>
</persistence>  

我读过一些关于Seam2的文章,但是配置是在components.xml文件中添加的:

代码语言:javascript
复制
<persistence:managed-persistence-context
        name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/modelEntityManagerFactory" />

<components>标记内。Seam 2中的下一步是添加:

代码语言:javascript
复制
<property name="jboss.entity.manager.factory.jndi.name"
                value="java:/modelEntityManagerFactory" />

persistence.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence ...>
    <persistence-unit name="MY_PERSISTENCE_UNIT_NAME" ...>
        ...
        <properties>
            ...

            <property name="jboss.entity.manager.factory.jndi.name"
                value="java:/modelEntityManagerFactory" />

        </properties>
    </persistence-unit>
</persistence>

但是在seam 3中没有文件components.xml。此外,在@Inject注释中也没有属性unitName来指定持久性单元。

因此,请帮助我配置我的项目,以便我可以使用EntityManager@Inject,如网络上的许多示例所示。

我使用的是Postgres数据库和JBoss AS 7

编辑:添加示例。我不在Entity类中使用EntityManager

代码语言:javascript
复制
@Named("validateReportAction")
@SessionScoped
public class ValidateReportAction extends ReportAction implements Serializable {

    private static final long serialVersionUID = -2456544897212149335L;

    @Inject
    private EntityManager em;
...
}  

在这个@Inject中,我收到了来自Eclipse "No bean is eligible for injection to the injection point [JSR-299 §5.2.1]“的警告

如果我在一些标记为Entity的bean上使用@Inject,那么@Inject就可以正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-07 20:18:51

您可以在CDI bean上使用@PersistenceContext。它不一定是EJB。

如果出于某种原因你想使用@Inject,你必须做更多的工作。@Inject不知道EntityManager;它只能注入其他托管bean。幸运的是,有一个简单的解决方法-使用一个生产者方法,作为一个简单的弹床。

代码语言:javascript
复制
@ApplicationScoped
public class EntityManagerProducer {

    @PersistenceContext
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager {
        return entityManager;
    }

    public void closeEntityManager(@Disposes EntityManager em) {
        if (em != null && em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        if (em != null && em.isOpen()) {
            em.close();
        }
    }

}

现在可以使用@Inject注入EntityManager。注入的EntityManager将是RequestScoped,而EntityManagerProducer是ApplicationScoped。此外,entityManager必须关闭。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8763115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档