关于删除级联休眠ManyToMany
问题描述:
我希望UserAcounts能够拥有很多UserGroups.And所有组都可以有很多用户。并且有一个连接表。我希望当连接表中的useraccount和usergroup之间的关系被删除时useraccount被删除。关于删除级联休眠ManyToMany
其实我想用“关于删除级联”。在ManyToMany关系我coulndn't不幸运行它。我已经尝试了很多东西,但没有找到解决方案。
注:我只是想就与删除级联删除
是有可能是有办法做到这一点?
这里是我的Hibernate类
@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;
我已经研究了太多,但我不能运行它。
答
级联设置为DELETE不会在删除用户时删除组和用户之间的关联。它会自己删除组。
要删除的关联,你只需要删除用户组的集合中的所有组删除用户之前:
user.getUserGroups().clear();
session.delete(user);
从用户删除组是什么将删除协会连接表。
答
来自JB Nizet的例子非常适合删除多个实体的关联。我不得不删除30万个协会。在这种情况下,尽管它不是Hibernate友好的(并且使用本机SQL语言的事实并不美观),但最好使用SQLQuery。由于性能问题,可能有必要。
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();
谢谢你对我有用。 – 2012-01-02 10:56:56