-1

Spring Data リポジトリを使用してエンティティを保存していますが、何らかの理由でカスケードがテスト 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);
}
4

1 に答える 1

0

「機能しない」メソッドは としてマークされてい@Transactionalます。デフォルトでは、Spring はテスト メソッドの最後でトランザクション動作をロールバックします。「機能する」とあなたが言う方法はトランザクションではなく、Spring テスト フレームワークはそれをロールバックする必要があることを認識していません。

したがって、単体テストの観点からすると、そうではないメソッドを使用してそこで行っていること@Transactionalは間違っています。動作をテストしてから、データベースをテスト前の状態に戻して、他のテストからのテスト データで汚染されることなく、同じデータベース (同じ状態) を他のテストに使用できるようにする必要があります。

したがって、他のメソッドでデータを挿入する場合は、@Transactional注釈を削除してください。しかし、私が言ったように、これはテストがどのように行われるべきかということではありません。

于 2014-07-25T11:04:31.537 に答える