2014-07-25 6 views
-1

나는 엔티티를 저장하기 위해 Spring 데이터 저장소를 사용하고 있지만, 어떤 이유로 cascade가 saveCountryAndNewCity() 테스트에 대해 작동하지 않습니다. 도시는 저장되지 않지만 saveCityAndNewCountry()에 대해 작동합니다. 유사하다. 왜 누군가가 나를 알아낼 수 있습니까? 고마워.스프링 저장소 캐스케이드

public class City { 
@Cascade(CascadeType.ALL) 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "countryid", nullable = false, insertable = true, updatable = true) 
private Country country; 

public void setCountry(Country country) { 
    this.country = country; 
    country.getCities().add(this); 
} 

} 


public class Country { 
@Cascade(CascadeType.ALL) 
@OneToMany(fetch = FetchType.EAGER, mappedBy = "country") 
private Set<City> cities = new HashSet<City>(0); 

public void addCity(City city){ 
    this.cities.add(city); 
    city.setCountry(this); 
} 
} 


@Test 
@Transactional 
public void saveCountryAndCity() throws Exception { 
    Country country = countryRepository.findOneByName("Canada"); 
    City newCity = new City(); 
    newCity.setName("Quebec"); 
    country.addCity(newCity); 

    countryRepository.save(country); 

} 

@Test 
public void saveCityAndNewCountry() throws Exception { 
    City city = cityRepository.findOneByName("London"); 

    Country country = new Country(); 
    country.setName("myCountry"); 
    city.setCountry(country); 

    cityRepository.save(city); 
} 
+0

1. 스프링 데이터 JPA는 캐스케이드 동작을 담당하지 않습니다. 그것은 JPA 구현 (나는 당신의 경우 최대 절전 모드라고 생각한다)이다. 문제를 더 잘 설명하기 위해 주제와 내용을 더 효과적으로 변경하십시오. –

답변

0

"작동"하지 않는 방법은 @Transactional으로 표시됩니다. 기본적으로, Spring은 테스트 메소드의 끝에서 모든 트랜잭션 동작을 롤백합니다. "작동한다"고 말하는 방식은 트랜잭션이 아니며 스프링 테스트 프레임 워크는 롤백해야한다는 것을 모르고있다.

따라서 단위 테스트의 관점에서 보면 @Transactional이 아닌 메서드를 사용하여 수행 한 작업이 잘못되었습니다. 동작을 테스트 한 다음 데이터베이스를 테스트 이전 상태로 되돌리려면 같은 상태의 동일한 데이터베이스를 다른 테스트의 데이터를 테스트하지 않고 다른 테스트에 사용할 수 있습니다.

다른 방법으로 데이터를 삽입하려면 @Transactional 주석을 제거하십시오. 하지만 제가 말했듯이 이것은 시험이 어떻게 이루어져야하는지는 아닙니다.