创建EntityManagerFactory时出现异常 - 在SerialContext中查找“persistence / myPU”失败

时间:2012-05-20 19:54:02

标签: spring hibernate jdbc glassfish-3

我正在使用Glassfish应用服务器并尝试将spring-hibernate Web应用程序连接到我的数据库,我有以下配置:

在Glassfish中,我添加了一个jdbc连接,并向数据库发送成功的ping。

我还添加了一个jndi名称为 jdbc / myResource 的JDBC资源(在glassfish中)。此资源位于我创建和测试的连接池下(步骤1)。

My EntityManaget使用@PersistenceContext注释:

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

在\ src \ main \ resources \ META-INF \下我创建了我的persistence.xml文件:

<persistence-unit name="myPU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/myResource</jta-data-source>
    <properties>
        <!-- Glassfish transaction manager lookup -->
        <property name="hibernate.transaction.manager_lookup_class"
            value="org.hibernate.transaction.SunONETransactionManagerLookup" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"></property>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.default_schema" value="PUBLIC" />
        <property name="hibernate.format_sql" value="true" />
        <!-- Validates the existing schema with the current entities configuration -->
        <property name="hibernate.hbm2ddl.auto" value="validate" />
    </properties>
</persistence-unit>

这就是我的applicationContext的样子:

bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
</bean>

<tx:annotation-driven transaction-manager="txManager" />

<jee:jndi-lookup id="emf" jndi-name="persistence/myPU" />

<!-- In order to enable EntityManager injection -->
<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
    <property name="persistenceUnits">
        <map>
            <entry key="myPU" value="persistence/myPU" />
        </map>
    </property>
</bean>

在我的web.xml中,我有:

<persistence-unit-ref>
<persistence-unit-ref-name>persistence/myPU</persistence-unit-ref-name>
<persistence-unit-name>myPU</persistence-unit-name>

当我发布时,我一直得到:

没有定义名为'myPU'的bean。有关更多详细信息,请参阅server.log。

为什么要将持久性单元作为bean来寻找? 我有什么想法吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

已解决 - 我在我的persistence.xml中添加了transaction-type =“JTA”。 出于某种原因,我的印象是如果我在我的persistence.xml中指定了一个jta-data-source,那么默认的事务类型应该是“JTA”,也许不是。我真的不明白我对此解决方案的异常关系,但目前我的persistence.xml有以下几行:

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

它就像一个魅力。