2017-03-04 3 views
0

bevölkert wird habe ich Test folgende:nicht in @Transactional Test Join-Tabelle

@Test 
public void createNewShopAndCheckUserShopsCollection() 
{ 
    //given 
    ShopEntity shop = new ShopEntity(); 
    String shopName = "test shop"; 

    MallEntity mall = new MallEntity(); 
    mall.setId(1L); 

    UserEntity user = userService.findOne(1L); 
    int shopsModeratedBefore = user.getModeratedShops().size(); 

    shop.setMall(mall); 
    shop.setName(shopName); 
    shop.setModerators(Collections.singletonList(user)); 


    ShopEntity savedShop = shopRepository.save(shop); 
    user = userService.findOne(1L); 

    assertThat(user.getModeratedShops()).hasSize(shopsModeratedBefore + 1); 
} 

in der Klasse mit @Transactional kommentiert. Ich muss nach der Ausführung zurückrollen, damit andere Tests nicht fehlschlagen. Es scheint jedoch, dass die Join-Tabelle vor dem Ende der Methode nicht gefüllt wird (die Assertion fällt). Wie kann ich manuell sicherstellen, dass es aktualisiert wird?

ist hier Mapping in UserEntity.java

@ManyToMany(mappedBy = "moderators") 
@JsonBackReference(value = "moderatedShops") 
@Setter 
@Getter 
private List<ShopEntity> moderatedShops; 

Und hier in ShopEntity.java

@ManyToMany 
@JoinTable(name = "shop_moderators", 
     joinColumns = @JoinColumn(name = "shop_id"), 
     inverseJoinColumns = @JoinColumn(name = "user_id")) 
@JsonManagedReference(value = "moderatedShops") 
@Setter 
@Getter 
private List<UserEntity> moderators; 
+0

bitte, zeigen Sie auch Ihre Entitäten Klassen, eine andere Sache ist, dass ich nicht weiß, ob diese Art von Test notwendig ist. Sie testen grundsätzlich, ob Sie etwas in db einfügen können - Sie testen keine Logik. Nicht sicher, ob Sie auch Spring-Boot verwenden, aber wenn Sie noch Daten in DB speichern möchten, werfen Sie einen Blick auf https://spring.io/blog/2016/04/15/testing-improvements-in-spring- boot-1-4 # testing-the-jpa-slice – pezetem

+0

@pezetem ich habe Entitäten hinzugefügt. Ich weiß, dass es in der realen Anwendung nicht viel Sinn macht, aber ich habe gerade über die Verwendung von vielen zu vielen Beziehungen gelernt, einige Methoden im jpa-Repository dazu hinzugefügt und ich wollte sicherstellen, dass das funktioniert. – KrwawyKefir

Antwort

0

was Sie in Ihrer Implementierung fehlt, ist eine Kaskadierung für das Kind. Fügen Sie einfach @ManyToMany(cascade = CascadeType.ALL) hinzu und das Speichern/Löschen sollte auch für untergeordnete Entitäten gelten.

+0

Das ist nicht das Problem. Ich möchte die Join-Tabelle und nicht die untergeordnete Entität aktualisieren. Wenn ich @Transactional Annotation entferne, funktioniert es gut, aber ich muss Ergebnisse zurückrollen, damit andere Tests ausgeführt werden können. – KrwawyKefir

Verwandte Themen