【问题标题】:Spring + JPA ( EclipseLink) + Glassfish that manages database through JDBC ConfigurationSpring + JPA ( EclipseLink) + Glassfish 通过 JDBC 配置管理数据库
【发布时间】:2013-11-14 00:46:21
【问题描述】:

我在 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:开始: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: No bean named 'persistenceUnit' is defined

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

【问题讨论】:

    标签: java spring jpa glassfish eclipselink


    【解决方案1】:

    由于您希望应用服务器管理数据库连接(以及我认为的实体管理器),因此创建 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。

    【讨论】:

    • 感谢 gerrytan 的回答。所以你说我的 applicationContext.xml 现在应该看起来像这样:&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=..."&gt; &lt;context:component-scan base-package="com.blogspot.prawalewa" /&gt; &lt;jee:jndi-lookup id="prawalewa" jndi-name="jdbc/prawalewa"/&gt; &lt;/beans&gt;? TransactionManager、EntityManagerFactory等呢?它是开箱即用的吗?
    • 实际上,我在上面编辑了我的帖子,因为现在我在获取 sessionFactory 时遇到了问题(尽管阅读了有关它的 Spring 手册......),如果你能看看,我会非常感激: )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2016-05-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多