[SPRING] EclipseLink 2.0 및 Spring 3.0.5 및 Tomcat 6을 구성하는 방법은 무엇입니까?
SPRINGEclipseLink 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.고마워, 제임스.
고마워, 제임스.
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.계속하려고 할 때 어떤 오류가 있습니까?
계속하려고 할 때 어떤 오류가 있습니까?
LoadTimeWeaver는 작동해야하지만 필수는 아닙니다. 대신에 정적 짜임새를 사용할 수 있습니다.
-
==============================
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()); } }
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
'SPRING' 카테고리의 다른 글
[SPRING] 확장 스프링 양식 태그 라이브러리 속성 (0) | 2019.03.17 |
---|---|
[SPRING] 안드로이드에서 스프링과 같은 패키지 스캐닝 구현하기 (0) | 2019.03.17 |
[SPRING] Quartz 트리거를 데이터베이스에 유지하는 올바른 방법 (0) | 2019.03.17 |
[SPRING] 사용자 당 하나의 세션 만 허용 (0) | 2019.03.17 |
[SPRING] Spring OpenSessionInViewInterceptor가 작동하지 않습니다. (0) | 2019.03.17 |