2014-01-15 2 views
0
@Entity 
public class EUser { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @ManyToMany(fetch=FetchType.EAGER) 
    private List<UserRole> roles; 
} 

при выполнении следующего действиязначение Hibernate не удаляя из Databse

EUser approveUser = (EUser) userService.getOne(2); 
approveUser.getRoles().clear(); 
userService.update(approveUser); 
System.out.println(approveUser.getRoles().size()); 

он говорит, что размер равен нулю, но, когда я иду в БД в таблице EUser_UserRole я вижу значение по-прежнему присутствует. Как это решить?

также в EUser_UserRole он говорит

This table does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available 

, как я могу удалить добавить редактировать удалить вручную ??

+0

Если userService.update() выполняет в EntityManager.merge(), это не должно быть необходимым.ApproveUser, скорее всего, будет экземпляром управляемого объекта, если вы будете следовать предложению CycDemo о добавлении каскадирования, тогда внесение изменений в объект сущности должно «автоматически» заставить поставщика сохранения сохранить изменения в базе данных в подходящий момент. – Gimby

ответ

0

se CascadeType. Reference

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<UserRole> roles; 

Update:

orphanRemoval атрибут можно использовать JPA 2.x версию. Вы должны выяснить, удаленные UserRole данные путем сравнения old rolesList и новые rolesList` атрибут

orphanRemoval не поддерживает в ManyToMany отображения.

+0

Я получаю следующую ошибку >> Атрибут orphanRemoval не определен для типа аннотации ManyToMany – LynAs

+0

'orphanRemoval' является поддержкой JPA 2.X verson. u не может использовать более низкую версию. – CycDemo

+0

Нет версии JPA поддерживает orphanRemoval на ManyToMany – kostja

0

Каскадирование - это действительно способ позволить Hibernate сделать удаление, и если я увижу опубликованный код, это, скорее всего, то, что требуется. Но поскольку речь идет о вручную удаление в то время как каскадные более автоматическое удаление, я должен добавить предложения:

  • использования EntityManager.remove()
  • вызова JPQL удаления запроса

Что больше подходит для описания «ручной» удаления.

0

Не используйте каскад для отношений ManyToMany. Это может привести к нежелательному удалению ряби в широком узловом кластере проще, чем можно было бы надеяться.

Если вы хотите очистить связь (удалить строки из таблицы соединений) для одного пользователя для своих ролей, вам необходимо очистить поля отношений с обеих сторон, то есть очистить список UserRole в EUser и удалить текущий EUser из списков в соответствующих UserRole экземплярах.

EDIT:

Вы не удалять любые объекты из базы данных при очистке списков связанных объектов. Единственный результат будет заключаться в том, что некоторые строки в таблице соединений будут удалены, а после следующего извлечения/обновления ваши EUser и UserRole экземпляры больше не будут связаны.

Если вы хотите удалить записи UserRoles DB, вы можете сделать это после удаления отношения к

+0

Я не хочу удалять пользователя. только роли должны быть удалены. – LynAs

+0

Должны ли роли быть удалены из БД или только из отношения? Я взял второе. См. Редактирование. – kostja

Смежные вопросы