복붙노트

[SPRING] EclipseLink 2.0 및 Spring 3.0.5 및 Tomcat 6을 구성하는 방법은 무엇입니까?

SPRING

EclipseLink 2.0 및 Spring 3.0.5 및 Tomcat 6을 구성하는 방법은 무엇입니까?

내 웹 응용 프로그램은 Tomcat 6.0.18과 Spring 3.0.5, eclipselink 2.0.1 및 javax.persistence 2.0.0, SQL Server Database를 사용합니다. 구성을 파악할 수 없었고 그러한 구성으로 작동하는 예를 찾을 수 없었습니다. loadTimeWeaver의 속성을 entityManagerFacotory에 추가하려고 시도했지만 applicationContext.xml에서 Spring 3의 AutoWired 주석을 중단합니다.

<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에 통합하는 방법에 대한 가이드 나 튜토리얼을 가르쳐 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.고마워, 제임스.

    고마워, 제임스.

    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 속성을 지정하지 않았습니다.

    Step3. 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.persist (todo) 만 남겨두고 em.getTransaction (). begin () 및 em.getTransaction (). commit ()을 주석 처리했습니다. 여기 엔 엔티티가 있습니다. 즉시 작동합니다. 여기서 개발자는 JPA 트랜잭션과 Spring 트랜잭션의 차이점을 알아야한다. 사실 SpringLink Management와 함께 일하는 EclipseLink / JPA는 혼란스러운 부분입니다.

    또한 Tomcat과 관련이있을 것으로 생각하여 Tomcat 7을 사용해 보았습니다. 사실,이 문제는 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 클래스, 공식적인 방법으로 시도 / 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 클래스는 Spring Transaction을 @Transactional annotation으로 선언하고, @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);
        }
    }   
    
  2. ==============================

    2.계속하려고 할 때 어떤 오류가 있습니까?

    계속하려고 할 때 어떤 오류가 있습니까?

    LoadTimeWeaver는 작동해야하지만 필수는 아닙니다. 대신에 정적 짜임새를 사용할 수 있습니다.

  3. ==============================

    3.@ jisun의 회신에 대한 또 다른 방법. 주석 구성에 의해 작성했으며 username, password, driver 등의 속성을 더 이상 제거하지 않았습니다. 이러한 모든 매개 변수가 persistence.xml에 정의 될 수 있기 때문에 :

    @ jisun의 회신에 대한 또 다른 방법. 주석 구성에 의해 작성했으며 username, password, driver 등의 속성을 더 이상 제거하지 않았습니다. 이러한 모든 매개 변수가 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());
        }
    
    }
    
  4. from https://stackoverflow.com/questions/10421829/how-to-configure-eclipselink-2-0-and-spring-3-0-5-and-tomcat-6 by cc-by-sa and MIT license