Каскадирование Spring Data CrudRepository удаляет на @OneToMany однонаправленной - PullRequest
2 голосов
/ 06 января 2012

Вечер всех,

У меня есть поле со следующей подписью:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="username")
private Collection<UserAuthority> authorities; 

Когда я пытаюсь удалить UserAuthority из коллекции, он пытается выполнить обновление, задав для имени пользователя значение null,вместо удаления.

Удалить:

...
authorities.remove(targetAuthority);
user.setAuthorities(authorities);
repo.save(user);
...

Это правильно?

Единственный способ, которым я могу заставить его правильно каскадно удалить, - это если у меня есть отдельный UserAuthorityрепозиторий и сделайте что-то вроде следующего

...
authRepo.delete(authorities);
...

Любая помощь будет потрясающей!

Спасибо!

1 Ответ

1 голос
/ 06 января 2012

Код, который вы дали выше, будет работать, если вы отобразите это как двунаправленное отношение:

 @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="user")   
 private Collection<UserAuthority> authorities;

, а затем в UserAuthority:

@ManyToOne
@JoinColumn(name="username")
private User user;

MappedBy сообщает Hibernate, что UserAuthority является владельцем-владельцем, то есть имеет внешний ключ, который определяет связь. Поэтому, когда вы хотите сохранить новую сущность UserAssociation, вы должны убедиться, что вы установили пользователя, к которому относится.

Это также приведет к более оптимизированному процессу сохранения, поскольку Hibernate может вставлять записи UserAuthority с правильным внешним ключом, а не вставлять, а затем обновлять, чтобы установить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...