2017-02-22 42 views
1

У меня возникает проблема ограничения при попытке удалить объект, содержащий отношения OneToMany, которые не должны происходить. Я установил cascade = CascadeType.ALL, попытался добавить аннотацию @Cascade Hibernate, попытался перестроить новую базу данных, и даже создал минимальный пример, под которым все сбой.Каскадирование не работает при удалении с помощью Spring Data JPA Repositories

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

объекта, чтобы быть каскадно

@Entity 
public class Bar { 

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

    @ManyToOne 
    private Foo foo; 

    // Constructor, getters and setters omitted 
} 

класса, содержащего каскадные

@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 
} 

Тест:

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

Это испытание терпит неудачу выше. Я ожидал, что удастся удалить Foo без необходимости удаления всех связанных объектов Bar, поскольку каскадирование было установлено в отношении OneToMany. Почему это не удается?

ответ

1

попробовать @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true)

+0

все еще имеют ту же ошибку с 'orphanRemoval'. –

+0

также попробуйте 'foo.getBars() добавить (bar)' в свои тесты, чтобы убедиться, что двунаправленная связь установлена ​​правильно. – Sergio

+0

Это исправлено. Означает ли это, что мне нужно добавить ассоциации к обоим объектам для поддержания двунаправленных отношений? Я понял, добавил ли я объект 'Foo' в объект' Bar', он автоматически создаст двунаправленную связь. –