Spring + JPA(EclipseLink)+ Glassfish,通过JDBC配置管理数据库

时间:2013-11-14 00:46:21

标签: java spring jpa glassfish eclipselink

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

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

(在阅读gerrytan的答案之后和我阅读Exception while creating EntityManagerFactory - 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但没有成功。有没有人可以告诉我如何正确地改变它或至少从哪里开始?或者我可能需要摆脱这个并以不同的方式配置应用程序?预先感谢您的帮助。非常感谢。

编辑:在阅读Exception while creating EntityManagerFactory - Lookup failed for 'persistence/myPU' in SerialContext之后,我对它进行了一些编辑,就像您在上面看到的一样,但是在部署时我仍然有两个例外:

  

java.lang.Exception:java.lang.IllegalStateException:ContainerBase.addChild:start: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中将它放在哪里?

1 个答案:

答案 0 :(得分:1)

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

我建议使用JNDI查找。您可以像这样

从JNDI获取EntityManagerFactory
<jee:jndi-lookup id="myEmf" jndi-name="persistence/myPersistenceUnit"/>

Spring Manual: 15.5.1 Three options for JPA setup in a Spring environment

上详细了解此信息

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