2014-07-16 2 views
0

내 서비스에서 JUnit 테스트를 실행하면 데이터베이스에 새 엔티티가 성공적으로 추가되지만 내 컨트롤러에서 서비스를 호출하면 데이터베이스에 저장되지 않습니다. 내가 뭘 놓치고 있니?스프링 JPA가 데이터베이스에 저장하지 않습니다.

jpa.xml

<jpa:repositories base-package="com.mypackage.commons" /> 

<bean id="jpaVendorAdapter" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="showSql" value="true" /> 
    <property name="generateDdl" value="true" /> 
    <property name="database" value="MYSQL" /> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="jdbcDataSource" /> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
    <!-- spring based scanning for entity classes --> 
    <property name="packagesToScan" value="com.mypackage" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" /> 

<tx:annotation-driven /> 

@Controller 
@Path("/users") 
public class MyAPI { 

    @Autowired 
    private UserService userService; 

    @POST 
    @Path("/add") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Transactional 
    public Response addUser(User newUser) { 
     userService.create(newUser); 
    } 
} 
+0

왜'Transactional' @에서 컨트롤러 레벨? –

+0

내가 블로그 게시물에서 본 것 같아서 내 문제를 해결하기 위해 노력했다. – Hank

+0

컨트롤러에서 지속 된 인스턴스가 필요하지 않기 때문에 @transactional은 서비스 수준에서만 사용해야한다고 생각한다. –

답변

0

@Service 
public class RepositoryUserService implements UserService { 

    @Resource 
    private UserRepository userRepository; 

    @Transactional 
    @Override 
    public User create(User user) { 
     User newUser = userRepository.save(user); 
     return newUser; 
    } 
} 

MyController에 UserService EntityManager를 설정

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

이 방식으로 구동되는 주석 : 트랜잭션에 대한

<tx:annotation-driven transaction-manager="transactionManager" 
    proxy-target-class="true" /> 

시도 세션을, 컨트롤러에서 @Transactional를 제거 전파를 정의하고 플러시를

@Transactional(propagation= Propagation.REQUIRED) 
    @Override 
    public User create(User user) { 
     try{ 
     return userRepository.saveAndFlush(user); 
     } catch(DataIntegrityViolationException e){ 
     // handle the exception in here to find out what is wrong    
     } 
    } 
+0

'saveAndFlush'를 시도 할 때'javax.persistence.TransactionRequiredException : 트랜잭션이 진행되지 않습니다'라는 메시지가 나타납니다 – Hank

+0

proxy-target-class = "true "? – Hank

+0

예 entityManagerFactoryBean에서'cglib'을 포함하고 jpa 속성을 구성해야합니다. –

관련 문제