【问题标题】:On Delete Cascade Hibernate ManyToMany在删除级联休眠多对多
【发布时间】:2014-03-26 17:52:15
【问题描述】:

我希望 UserAcounts 能够有多个 UserGroups。并且所有组可以有很多用户。并且有一个连接表。我希望在删除用户帐户时删除连接表中的用户帐户和用户组之间的关系。

实际上我想使用“删除级联”。不幸的是,在多对多关系中我无法运行它。我尝试了很多东西,但没有找到解决方案。

注意:我只想在删除级联时删除关系

有没有办法做到这一点?

这是我的休眠类

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

我研究了太多,但我无法运行它。

【问题讨论】:

    标签: hibernate hibernate-annotations


    【解决方案1】:

    当您删除用户时,设置为 DELETE 的级联不会删除组与用户之间的关联。它会删除组本身。

    要删除关联,您只需在删除用户之前从用户的组集合中删除所有组:

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

    从用户中删除组将从连接表中删除关联。

    【讨论】:

      【解决方案2】:

      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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 2010-11-03
        • 1970-01-01
        • 2019-07-31
        相关资源
        最近更新 更多