【发布时间】:2012-01-06 19:11:55
【问题描述】:
在我的项目中,我使用 Seam 3,但在注入带有 @Inject 注释的 EntityManager 时遇到问题。我很确定有某种配置可以确保EnityManager 知道使用哪个PersistenceUnit。例如EJB,您可以输入:
@PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME")
private EntityManager eManager;
在persistence.xml 文件中配置了哪个持久性单元。这是我的伪配置:
<?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>
我已经阅读了一些关于 Seam 2 的文章,但是在 components.xml 文件中添加了以下配置:
<persistence:managed-persistence-context
name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/modelEntityManagerFactory" />
在<components> 标签内。 Seam 2 的下一步是添加:
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/modelEntityManagerFactory" />
在persistence.xml
<?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 来指定持久性单元。
所以请帮助我配置我的项目,以便我可以使用@Inject 和EntityManager,如网络上的许多示例所示。
我使用Postgres 数据库和JBoss AS 7。
编辑:添加示例。我不在Entity 类中使用EntityManager。
@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 可以正常工作。
【问题讨论】:
-
你有什么问题?如果在同一个persistence.xml 中有多个持久性单元,则只需在注释中使用鉴别器。因为它是你只有一个,这将是默认的。确保您的 persistence.xml 与您的 DAO 和实体类位于同一模块 (JAR) 中。
-
@Perception 请看我编辑的帖子,并给我一些鉴别器的例子。
-
Maistora - 您不需要鉴别器注释,您的 persistence.xml 中只有一个 PU。但是根据您添加的错误消息,我很确定 Eclipse 没有找到您的 JBoss JEE 实现文件。如果您使用的是 Maven,那么您需要将 jboss-javaee-web-6.0 依赖项添加到您的 POM。如果您正在使用其他构建工具,则需要手动查找 JAR 并将其添加到项目类路径中。
-
如果消息是困扰你的问题,我必须说我成功地在一些 bean 上使用了 [et]Inject。例如@Inject private UserBean userBean;其中 UserBean 被标记为实体。
标签: java configuration persistence cdi seam3