как написать запрос на удаление в спящем режиме для отношений «многие ко многим»

У меня есть два пользователя bean и виртуальный домен

@Entity
@Table(name = "tblUser")

public class User implements Serializable {
    private Long id;
    private String username;
private String deleteflag;
    private Set<VirtualDomain> virtualdomainset;
@Id

@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
        return id;
}

public void setId(Long id) {
        this.id = id;
}

@Column(name = "username", length = 50, nullable = false)
public String getUsername() {
        return username;
}

public void setUsername(String username) {
        this.username = username;
}
@Column(name = "deleteflag")
    public String getDeleteflag() {
        return deleteflag;
    }

    public void setDeleteflag(String deleteflag) {
        this.deleteflag = deleteflag;
    }
   @ManyToMany(targetEntity = VirtualDomain.class, cascade = {CascadeType.PERSIST},fetch=FetchType.EAGER)
    @JoinTable(name = "tblUserDomainRel", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "domainid"))
    public Set<VirtualDomain> getVirtualdomainset() {
        return virtualdomainset;
    }

public void setVirtualdomainset(Set<VirtualDomain> virtualdomainset) {
    this.virtualdomainset = virtualdomainset;
}

}



@Entity
@Table(name = "tblVirtualDomain")
public class VirtualDomain  {
    private Long id;
    private String domainname;
private String deleteflag;
    private Set<User> userset;
@Id
@JoinColumn(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
        return id;
}

public void setId(Long id) {
        this.id = id;
}

@Column(name = "domain_name")
public String getDomainname() {
        return domainname;
}

public void setDomainname(String domainname) {


     this.domainname = domainname;
}
@Column(name = "deleteflag")
    public String getDeleteflag() {
        return deleteflag;
    }

    public void setDeleteflag(String deleteflag) {
        this.deleteflag = deleteflag;
    }
@ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class)

public Set<User> getUserset() {
        return userset;
}

public void setUserset(Set<User> userset) {
        this.userset = userset;
}
}

Теперь, когда я удаляю какого-либо пользователя, я использую для установки флага удаления, что означает, что данные остаются в базе данных. Мое требование состоит в том, что пользователь, чей флаг удаления установлен, должен быть удален из таблицы tblUserDomainRel, поэтому как написать этот запрос на удаление.


person Jugal    schedule 05.06.2009    source источник


Ответы (1)


просто удалите виртуальный домен из коллекции на пользователе и удалите другую сторону для полноты

// on User
public void removeVirtualDomain(VirtualDomain vd){
    virtualDomainset.remove(vd);
    vd.getUserset().remove(this)
}

это удалит запись об отношениях. Или чтобы удалить пользователя из всех виртуальных доменов:

// on User
public void removeFromAllVirtualDomains(){
    for( VirtualDomain vd : virtualdomainset ){
        vd.getUserset().remove(this);
    }
    virtualDomainset.clear();        
}
person Gareth Davis    schedule 05.06.2009
comment
Я написал первую функцию и вызвал ее, когда устанавливал флаг удаления VirtualDomain, но она не работает, выдавая ошибку java.lang.NullPointerException в строке virtualDomainser.remove(vd). - person Jugal; 05.06.2009
comment
это не так много, но я предполагаю, что vitualDomainset равен нулю. - person Gareth Davis; 05.06.2009