При удалении Cascade Hibernate ManyToMany

Я хочу, чтобы UserAcounts могли иметь много UserGroups. И все группы могут иметь много пользователей. И есть таблица соединений. Я хочу, чтобы связь между учетной записью пользователя и группой пользователей в таблице соединений удалялась при удалении учетной записи пользователя.

На самом деле я хочу использовать «каскад удаления». В отношении ManyToMany я, к сожалению, не смог его запустить. Я так много пробовал, но не нашел решения.

Примечание. Я просто хочу, чтобы отношение было удалено с помощью каскадного удаления.

это возможно, есть ли способ сделать это?

Вот мои спящие классы

@SuppressWarnings("serial")
@Entity
@Table(name = "USER_ACCOUNT")
public class UserAccount implements Serializable {

@Id
@Column(name = "ID")
@GeneratedValue
private Long id;

@Column(name = "NAME")
private String name;

@Column(name = "SURNAME")
private String surname;

@Column(name = "EMAIL")
private String email;

@Column(name = "USER_NAME")
private String username;

@Column(name = "PASSWORD")
private String password;

@Column(name = "ENABLED")
@Type(type = "yes_no")
private boolean enabled;

@Column(name = "ACCOUNT_NON_EXPIRED")
@Type(type = "yes_no")
private boolean accountNonExpired;

@Column(name = "CREDENTIALS_NON_EXPIRED")
@Type(type = "yes_no")
private boolean credentialsNonExpired;

@Column(name = "ACCOUNT_NON_LOCKED")
@Type(type = "yes_no")
private boolean accountNonLocked;

@Column(name = "ENTRY_DATE")
private Date entryDate;

@Column(name = "UPDATE_DATE")
private Date updateDate;

@Column(name = "LAST_LOGIN_DATE")
private Date lastLoginDate;

@Column(name = "LOCAL")
private String local;

@ManyToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name = "ACCOUNT_GROUP", joinColumns = { @JoinColumn(name = "ID") }, inverseJoinColumns = { @JoinColumn(name = "GROUP_ID") })
private List<UserGroup> userGroups;








@SuppressWarnings("serial")
@Entity
@Table(name = "USER_GROUP")
public class UserGroup implements Serializable {

@Id
@Column(name = "GROUP_ID")
@GeneratedValue
private Long id;

@Column(name = "GROUP_NAME")
private String name;

@Column(name = "GROUP_DESCRIPTION")
private String description;

Я слишком много исследовал, но не смог запустить.


person Ahmet DAL    schedule 02.01.2012    source источник


Ответы (2)


Каскад, установленный на DELETE, не удалит связь между группой и пользователем при удалении пользователя. Это удалит сами группы.

Чтобы удалить ассоциацию, вам просто нужно удалить все группы из коллекции групп пользователя перед удалением пользователя:

user.getUserGroups().clear();
session.delete(user);

Удаление групп из пользователей — это то, что удалит ассоциации из таблицы соединений.

person JB Nizet    schedule 02.01.2012

Пример от JB Nizet отлично подходит для удаления ассоциаций для нескольких сущностей. Мне пришлось удалить 300 000 ассоциаций. В этом случае может быть предпочтительнее использовать SQLQuery, даже если он не подходит для Hibernate (и тот факт, что вы используете собственный язык SQL, не очень хорош). Из-за проблем с производительностью это может быть необходимо.

    SQLQuery queryDeleteDisabled = getSession().createSQLQuery("delete from ACCOUNT_GROUP where ID in (select ID from USER_ACCOUNT where ENABLED=?)");
    queryDeleteDisabled.setParameter(0, false);
    int nbDelete = queryDeleteDisabled.executeUpdate();
person thebignet    schedule 26.03.2014