0

我在 StackOverflow 中检查了很多以前的问题,但它们都没有解决我的问题。

我有一个部署在 Glassfish 上的 Spring + JSF + JPA (EclipseLink) 应用程序,现在我希望我的应用程序服务器管理与数据库 (PostgreSQL) 的连接。在管理面板中,我设置了 JDBC 连接池以及 JDBC 资源,并且能够从 Glassfish 管理面板中 ping 我的数据库。但是,我不知道如何正确配置我的应用程序以使用此新配置。我的 applicationContext 应该是什么样子?

(在 gerrytan 的回答和我在创建 EntityManagerFactory 时阅读 Exception - Lookup failed for 'persistence/myPU' in SerialContext之后编辑):

我的 persistence.xml 看起来像这样:

<persistence-unit name="persistenceUnit">
    <jta-data-source>jdbc/prawalewa</jta-data-source>
    <class>com.blogspot.prawalewa.model.AdditionalInfoEntity</class>
    <class>com.blogspot.prawalewa.model.ArticleEntity</class>
    <class>com.blogspot.prawalewa.model.ArticleFrameEntity</class>
    <class>com.blogspot.prawalewa.model.ChangeEntity</class>
    <class>com.blogspot.prawalewa.model.CommentEntity</class>
    <class>com.blogspot.prawalewa.model.ContentEntity</class>
    <class>com.blogspot.prawalewa.model.HeaderEntity</class>
    <class>com.blogspot.prawalewa.model.ImageEntity</class>
    <class>com.blogspot.prawalewa.model.MessagerEntity</class>
    <class>com.blogspot.prawalewa.model.PointsBucketEntity</class>
    <class>com.blogspot.prawalewa.model.PointsTypedEntity</class>
    <class>com.blogspot.prawalewa.model.PointsTypedPointsBucketEntity</class>
    <class>com.blogspot.prawalewa.model.RankEntity</class>
    <class>com.blogspot.prawalewa.model.RankTypeEntity</class>
    <class>com.blogspot.prawalewa.model.TagEntity</class>
    <class>com.blogspot.prawalewa.model.UserEntity</class>
    <class>com.blogspot.prawalewa.model.UserCookieEntity</class>
    <class>com.blogspot.prawalewa.model.VoteEntity</class>


</persistence-unit>

这是 applicationContext 的骨架(这是最大的问题-不确定如何更改它):

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:jee="http://www.springframework.org/schema/jee"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

<context:component-scan base-package="com.blogspot.prawalewa" />
<jee:jndi-lookup id="prawalewa" jndi-name="jdbc/prawalewa"/>
</beans>

还有我的 web.xml:

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

我的模范 Dao 实现方式如下所示:

public class UserDaoImpl implements UserDao {

protected EntityManager entityManager;

public EntityManager getEntityManager() {
    return entityManager;
}
@PersistenceContext(unitName = "persistenceUnit")
public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}


@Override
public void addUser(UserEntity userEntity) {
    getEntityManager().persist(userEntity);

}

@Override
public void removeUser(int userId) {
    Query query = getEntityManager().createQuery(
            "DELETE FROM UserEntity u WHERE u.id = :userid");
    query.setParameter("userid", userId);
}
}

仅此而已。现在尝试以多种方式更改 ApplicationContext 但没有成功。有没有人可以告诉我如何正确更改它或至少从哪里开始?或者我现在需要摆脱这个并以不同的方式配置应用程序?预先感谢您的帮助。非常感激。

编辑:在创建 EntityManagerFactory 时阅读 Exception - 在 SerialContext 中查找“persistence/myPU”失败后,我对其进行了一些编辑,就像您在上面看到的那样,但我现在在部署时仍然遇到两个异常:

java.lang.Exception:java.lang.IllegalStateException:ContainerBase.addChild:开始:org.apache.catalina.LifecycleException:org.springframework.beans.factory.BeanCreationException:创建名为“registrationBean”的bean时出错:注入自动装配依赖项失败; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:public com.blogspot.prawalewa.user.bo.RegistrationBo com.blogspot.prawalewa.user.bean.RegistrationBean.registrationBo;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“registrationBoImpl”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:com.blogspot.prawalewa.user.dao.UserDao com.blogspot.prawalewa.user。bo.impl.RegistrationBoImpl.registrationDao; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“userDaoImpl”的 bean 时出错:注入持久性依赖项失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“persistenceUnit”的 bean

我应该把它放在 applicationContext.xml 的什么地方?

4

1 回答 1

1

由于您希望应用服务器管理数据库连接(以及我认为的实体管理器),因此创建 BasicDataSource 和 LocalContainerEntityManagerFactoryBean 是错误的/不合适的。

我建议使用 JNDI 查找。您可以像这样从 JNDI 获取 EntityManagerFactory

<jee:jndi-lookup id="myEmf" jndi-name="persistence/myPersistenceUnit"/>

在 Spring 手册中阅读有关此内容的更多信息:15.5.1 Spring 环境中 JPA 设置的三个选项

作为个人喜好,我在使用 Spring 时倾向于使用像 tomcat 这样的低功能容器——因此减少了重复和微调。对于像 Glassfish 这样的全功能容器,我宁愿使用没有 Spring 的完整 Java-EE。

于 2013-11-14T01:00:29.080 回答