Spring存储库级联

时间:2014-07-25 10:50:58

标签: spring spring-data hibernate-cascade

我正在使用Spring Data存储库来保存我的实体,但由于某种原因,级联不适用于测试saveCountryAndNewCity():城市没有得到保存,但它适用于类似的saveCityAndNewCountry()。有人可以帮我找出原因吗? THX。

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);
}

1 个答案:

答案 0 :(得分:0)

你的方法没有工作&#34;标记为@Transactional。默认情况下,Spring将在测试方法结束时回滚任何事务行为。你说它的方法&#34;工作&#34;不是事务性的,Spring测试框架也不知道它需要回滚。

因此,从单元测试的角度来看,你在那里使用非@Transactional的方法做错了。您可能只想测试行为,然后将数据库恢复到测试之前的状态,以便同一个数据库(处于相同状态)可以用于其他测试,而不会受到来自其他测试的测试数据的污染。 / p>

因此,如果您希望其他方法插入数据,请删除@Transactional注释。但是,正如我所说,这并不是应该如何进行测试。