我在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中将它放在哪里?
答案 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。