2017-02-22 3 views
1

Je rencontre un problème de contrainte lorsque j'essaie de supprimer un objet contenant une relation OneToMany qui ne devrait pas se produire. J'ai mis cascade = CascadeType.ALL, essayé d'ajouter l'annotation spécifique à Hibernate @Cascade, j'ai essayé de reconstruire une nouvelle base de données, et j'ai même créé l'exemple minimal ci-dessous qui échoue.La cascade ne fonctionne pas lors de la suppression avec les référentiels JPA Spring Data

Cannot delete or update a parent row: a foreign key constraint fails (`test-db`.`bar`, CONSTRAINT `FKdvoqij212wwl2bf14kwo55h55` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`)) 

objet à cascade

@Entity 
public class Bar { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ManyToOne 
    private Foo foo; 

    // Constructor, getters and setters omitted 
} 

classe contenant en cascade

@Entity 
public class Foo { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<Bar> bars; 

    // Constructor, getters and setters omitted 
} 

Test:

// Spring Data JPA Repositories (extend CrudRepository) 
@Autowired private FooRepository fooRepository; 
@Autowired private BarRepository barRepository; 

@Test 
public void test() { 
    final Foo foo = new Foo(); 
    fooRepository.save(foo); 

    final Bar bar = new Bar(); 
    bar.setFoo(foo); 
    barRepository.save(bar); 

    fooRepository.delete(foo); 
} 

Ce test échoue ci-dessus. Je m'attendais à pouvoir supprimer Foo sans avoir à supprimer tous les objets Bar associés car la cascade était définie sur la relation OneToMany. Pourquoi est-ce échouer?

Répondre

1

essayer @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true)

+0

ont toujours la même erreur avec 'orphanRemoval'. –

+0

essayez également 'foo.getBars(). Add (bar)' dans vos tests pour vous assurer que la relation bidirectionnelle est correctement établie. – Sergio

+0

Cela l'a réparé. Est-ce que cela signifie que je dois ajouter les associations aux deux objets pour maintenir une relation bidirectionnelle? Je me suis dit que si j'ajoutais l'objet 'Foo' à l'objet' Bar', cela créerait automatiquement une relation bidirectionnelle. –