nyx*_*yxz 3 java configuration persistence cdi seam3
在项目中,我使用Seam 3,我注射有问题EntityManager与@Inject注解.我很确定有某种配置可以确保EnityManager知道PersistenceUnit要使用哪种配置.例如,EJB你可以输入:
@PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME")
private EntityManager eManager;
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些关于Seam 2的文章,但是配置是components.xml通过添加以下内容在文件中进行的:
<persistence:managed-persistence-context
name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/modelEntityManagerFactory" />
Run Code Online (Sandbox Code Playgroud)
在<components>标签内.Seam 2的下一步是添加:
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/modelEntityManagerFactory" />
Run Code Online (Sandbox Code Playgroud)
在里面 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>
Run Code Online (Sandbox Code Playgroud)
但它缝在Seam 3没有文件components.xml.此外unitName,@Inject注释中没有用于指定持久性单元的属性.
所以请帮我配置我的项目,以便我可以使用网络上的许多示例中显示的@Injectwith EntityManager.
我使用Postgres数据库和JBoss AS 7.
编辑:添加一个例子.我没有EntityManager在Entity课堂上使用.
@Named("validateReportAction")
@SessionScoped
public class ValidateReportAction extends ReportAction implements Serializable {
private static final long serialVersionUID = -2456544897212149335L;
@Inject
private EntityManager em;
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,@Inject我得到Eclipse" No bean is eligible for injection to the injection point [JSR-299 §5.2.1]"的 警告
如果我使用@Inject了一些豆子被标记为Entity的@Inject精品工程.
您可以在CDI bean上使用@PersistenceContext.它不一定是EJB.
如果由于某种原因你想使用@Inject,你必须做更多的工作.@Inject不知道EntityManager; 它只能注入其他托管bean.令人高兴的是,有一个简单的解决方法 - 使用一个充当简单蹦床的生产者方法.
@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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以使用@Inject注入EntityManager.注入的EntityManager将是RequestScoped,而EntityManagerProducer是ApplicationScoped.此外,必须关闭entityManager.
| 归档时间: |
|
| 查看次数: |
8761 次 |
| 最近记录: |