Como configurar o EclipseLink 2.0 e Spring 3.0.5 e o Tomcat 6?

Meu aplicativo da web está usando o Tomcat 6.0.18 e Spring 3.0.5 e eclipselink 2.0.1 e javax.persistence 2.0.0, SQL Server Database. Eu não consegui descobrir a configuração e também não consegui descobrir um exemplo de trabalho com tais configurações. Eu tentei adicionar propriedade de loadTimeWeaver em entityManagerFacotory, mas ele quebra a anotação AutoWired no Spring 3, como abaixo em applicationContext.xml:

 

em appname-servlet.xml:

Mas quando desativo o LoadTimeWeaver, meu aplicativo pode criar um database a partir do código JPA, mas não conseguiu persistir dados no database.

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

Ficarei grato se você puder me indicar um guia ou tutorial sobre a integração do EclipseLink ao Spring 3 mais o Tomcat.

Obrigado, James.

Seguindo as orientações da Springsource em http://static.springsource.org/spring/docs/3.0.0.M4/reference/html/ch13s05.html , o Tomcat 6 trabalha na tecelagem. As etapas mencionadas na orientação e copiadas aqui:

Step1.Copie spring-tomcat-weaver.jar em $ CATALINA_HOME / lib, em que $ CATALINA_HOME representa a raiz da instalação do Tomcat)

Passo 2. Diga ao Tomcat para usar o classloader personalizado, modificando context.xml:

    

Não especifiquei no caminho e no atributo docBase, como coloquei em $ CATALINA_HOME / conf / context.xml

Etapa 3. Ative a propriedade loadTimeWeaver para LocalContainerEntityManagerFactoryBean

      

então, eu iniciei o Tomcat 6 novamente e o processo de boot ficou limpo. No entanto, os dados ainda não puderam ser mantidos no database. O erro é como abaixo:

Não é permitido criar transactions no EntityManager compartilhado – use transactions Spring ou EJB CMT

Meu colega de trabalho me salvou neste ponto apontando que a transação da Spring estava sendo tratada com @Transactional e não usava transactions no gerenciador de entidades para evitar o problema acima. então eu comentei em.getTransaction (). begin () e em.getTransaction (). commit (), deixando apenas em.persist (todo). todo é a entidade aqui. Isso funciona imediatamente. Aqui, o desenvolvedor deve estar ciente de que a diferença entre transação JPA e transação Spring. Na verdade, é uma parte confusa quando o EclipseLink / JPA trabalha com o Spring Transaction Management.

Eu também tentei o Tomcat 7 como eu pensei que poderia estar relacionado ao Tomcat. Na verdade, esse problema não tem nada a ver com a versão do Tomcat.

Com o LoadTimeWeaver ativado, ele funciona na persistência de dados. Aqui está a versão de trabalho na parte de configuração do transactionManager em applicationname-servlet.xml:

                                

Abaixo está a minha class Dao, de maneira formal, try / catch deve estar em volta do código dentro do método:

 @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()>>>"); } } 

A class TodoService declara Spring Transaction com anotação @Transactional, o @Autowired também está funcionando depois de ativar o 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); } } 

Qual erro você recebe quando tenta persistir?

O LoadTimeWeaver deve funcionar, mas não é obrigatório. Você poderia usar a tecelagem estática em vez disso.

Como uma maneira adicional para a resposta do @jisun.Eu fiz isso por configuração de anotação e removi mais propriedades, como nome de usuário, senha, driver etc.Porque todos esses parâmetros podem ser definidos em 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()); } }