标签:java spring jpa tomcat eclipselink
我的Web应用程序使用Tomcat 6.0.18和Spring 3.0.5以及eclipselink 2.0.1和javax.persistence 2.0.0,SQL Server数据库.我无法弄清楚配置,也无法找到具有此类配置的工作示例.我尝试将loadTimeWeaver的属性添加到entityManagerFacotory中,但它在Spring 3中破坏了AutoWired批注,如下面的applicationContext.xml中所示:
<context:load-time-weaver/>
在appname-servlet.xml中:
但是当我禁用LoadTimeWeaver时,我的应用程序可以从JPA代码创建数据库,但无法将数据保存到数据库中.
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:persistence.xml" />
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="restfulPU" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="showSql" value="true"/>
<property name="generateDdl" value="true"/>
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.SQLServerPlatform"/>
</bean>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
</property>
<property name="jpaPropertyMap">
<props>
<prop key="eclipselink.weaving">false</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Persistence.xml
<persistence-unit name="restfulPU" transaction-type="RESOURCE_LOCAL">
<class>com.generalform.eclipselink.model.Todo</class>
<properties>
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
如果您能指导我将EclipseLink集成到Spring 3和Tomcat中,我将非常感激.
解决方法:
谢谢,詹姆斯.
在http://static.springsource.org/spring/docs/3.0.0.M4/reference/html/ch13s05.html的Springsource指导之后,Tomcat 6开始编织.指南中提到的步骤在此处复制:
Step1.Copy spring-tomcat-weaver.jar到$CATALINA_HOME / lib,其中$CATALINA_HOME表示Tomcat安装的根目录)
第2步.通过修改context.xml告诉Tomcat使用自定义类加载器:
<Context path="/myWebApp" docBase="/my/webApp/location">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
useSystemClassLoaderAsParent="false"/>
</Context>
我在$CATALINA_HOME / conf / context.xml中没有指定path和docBase属性
第三步.将loadTimeWeaver属性设置为LocalContainerEntityManagerFactoryBean
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver"/>
</property>
</bean>
然后,我再次启动Tomcat 6,启动过程变得干净.但是,数据仍然无法持久存储到数据库中.错误如下:
不允许在共享的EntityManager上创建事务 – 使用Spring事务或EJB CMT
我的同事在这一点上通过指出使用@Transactional的Spring事务处理而不是在实体管理器上使用事务来避免上述问题来救了我.然后我注释掉em.getTransaction().begin()和em.getTransaction().commit(),只留下em.persist(todo). todo是这里的实体.它立即起作用.在这里,开发人员应该意识到JPA事务和Spring事务之间的区别.事实上,当EclipseLink / JPA使用Spring Transaction Management时,这是一个困惑的部分.
我也尝试过Tomcat 7,因为我认为它可能与Tomcat有关.实际上,这个问题与Tomcat版本无关.
启用LoadTimeWeaver后,它可以处理数据持久性.以下是applicationname-servlet.xml中transactionManager配置部分的工作版本:
<context:property-placeholder location="classpath:generalform.properties"/>
<context:component-scan base-package="com.generalform" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${mysql.database.driver}" />
<property name="url" value="${mysql.database.url}" />
<property name="username" value="${mysql.database.user}" />
<property name="password" value="${mysql.database.password}" />
</bean>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:persistence.xml" />
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="restfulPU" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="showSql" value="true"/>
<property name="generateDdl" value="true"/>
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform"/>
</bean>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
</property>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" />
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
下面是我的Dao类,以正式方式,try / catch应该包含在方法内部的代码中:
@Repository("todoDao")
public class TodoDao {
@PersistenceContext
private EntityManager em;
public void saveTodo(Todo todo) {
System.out.println("TodoDao:saveTodo into DB >>>");
//em.getTransaction().begin();
em.persist(todo);
//em.getTransaction().commit();
em.close();
System.out.println("TodoDao: complete saveTodo into DB close()>>>");
}
}
TodoService类使用@Transactional注释声明Spring Transaction,@ Autowired在启用LoadTimeWeaver后也正在工作:
@Service("todoService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class TodoService {
@Autowired
private TodoDao todoDao;
public TodoService() {
}
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void saveTodo(Todo todo) {
System.out.println("TodoService -> saveTodo is called!");
todoDao.saveTodo(todo);
}
}
标签:java,spring,jpa,tomcat,eclipselink 来源: https://codeday.me/bug/20190621/1249969.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。