如何配置EclipseLink 2.0和Spring 3.0.5以及Tomcat 6?

我的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中所示:

 

在appname-servlet.xml中:

但是当我禁用LoadTimeWeaver时,我的应用程序可以从JPA代码创建数据库,但无法将数据保存到数据库中。

                 false        Persistence.xml  com.generalform.eclipselink.model.Todo      

如果您能指导我将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使用自定义类加载器:

    

我在$ CATALINA_HOME / conf / context.xml中没有指定path和docBase属性

第三步。 将loadTimeWeaver属性设置为LocalContainerEntityManagerFactoryBean

      

然后,我再次启动了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配置部分的工作版本:

                                

下面是我的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); } } 

当你试图坚持时你会得到什么错误?

LoadTimeWeaver应该可以工作,但不是必需的。 您可以使用静态编织。

作为@jisun回复的另一种方式。我通过注释配置完成并删除了更多属性,如用户名,密码,驱动程序等。因为所有这些参数都可以在persistence.xml中定义:

 package com.company.config; import javax.annotation.Resource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.core.env.Environment; import org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver; import org.springframework.orm.jpa.JpaTransactionManager; @Configuration @ComponentScan(basePackages = "com.company") @EnableTransactionManagement @EnableWebMvc public class MvcConfiguration extends WebMvcConfigurerAdapter { @Resource private Environment env; @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setPersistenceXmlLocation("classpath:persistence.xml"); emf.setLoadTimeWeaver(new ReflectiveLoadTimeWeaver()); return emf; } @Bean public JpaTransactionManager transactionManager() { return new JpaTransactionManager(entityManagerFactory().getObject()); } }