删除具有多对多集合的对象
delete object with a manytomany collection
情况:试图删除拥有一组人(朋友)的人。当然我不希望朋友被删除所以我必须小心。
个人代码:
@Entity
public class Person {
private String naam, voornaam, email, password;
@Id
private String username;
private String status;
@ManyToMany
private Collection<Person> vrienden;
@OneToMany(orphanRemoval = true)
private Collection<Post> posts;
@Enumerated(EnumType.STRING)
private Role role;
public Person(String naam, String voornaam, String email, String password, String username) {
setNaam(naam);
setEmail(email);
setStatus("online");
setVoornaam(voornaam);
setPassword(password);
setUsername(username);
vrienden = new HashSet<>();
posts = new HashSet<>();
role = Role.USER;
}
public static void addFriend(Person a, Person b) {
a.addFriend(b);
b.addFriend(a);
}
private void addFriend(Person b) {
this.vrienden.add(b);
}
public static void deleteFriend(Person a, Person b) {
a.deleteFriend(b);
b.deleteFriend(a);
}
private void deleteFriend(Person a) {
this.vrienden.remove(a);
}
public Collection<Person> getFriends() {
return vrienden;
}
public Role getRole() {
return this.role;
}
public void setRole(Role role) {
this.role = role;
}
@NotNull(message = "{error.no.name}")
@Size(min = 2, message = "{error.invalid.namesize}")
public String getNaam() {
return naam;
}
public void setNaam(String naam) {
this.naam = naam;
}
@NotNull(message = "{error.no.surnaam}")
@Size(min = 2, message = "{error.invalid.surnamesize}")
public String getVoornaam() {
return voornaam;
}
public void setVoornaam(String voornaam) {
this.voornaam = voornaam;
}
@NotNull(message = "{error.no.email}")
@Email(message = "{error.invalid.email}")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@NotNull(message = "{error.no.status}")
@Size(min = 1, message = "{error.no.valid.status}")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@NotNull(message = "{error.no.username}")
@Size(min = 2, message = "{error.invalid.usernamesize}")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = Password.getSaltedHash(password);
}
public boolean isPasswordCorrect(String password) {
boolean result = false;
result = Password.check(password, this.password);
return result;
}
@NotNull(message = "{error.no.password}")
@Size(min = 2, message = "{error.invalid.usernamesize}")
public String getPassword() {
return this.password;
}
public void addPost(Post p) {
if (p == null) {
throw new DomainException("Post is null");
}
posts.add(p);
}
public void deletePost(Post p) {
if (p == null) {
throw new DomainException("Post is null");
}
posts.remove(p);
}
public Collection<Post> getPosts() {
return posts;
}
@Override
public int hashCode() {
int hash = 3;
hash = 59 * hash + Objects.hashCode(this.username);
return hash;
}
public void setHashedPassword(String password) {
this.password = password;
}
}
我目前使用的方法是:
public void DeletePerson(String user) {
entityManager.getTransaction().begin();
entityManager.createQuery("delete from Person p where p.username=:username").setParameter("username", user).executeUpdate();
entityManager.getTransaction().commit();
}
它给出了以下错误:
java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'PERSON' caused a violation of foreign key constraint 'PRSNPRSNVRNDNSRNME' for key (vincent). The statement has been rolled back.
我的猜测是在 manytomany 注释中添加一些东西
创建表:
https://i.stack.imgur.com/zS2Xf.png
更新:
我现在使用的删除成功代码:
public void DeletePerson(String user) {
entityManager.getTransaction().begin();
entityManager.createNativeQuery("delete from PERSON_PERSON p where p.PERSON_USERNAME=?username or p.VRIENDEN_USERNAME=?username").setParameter("username", user).executeUpdate();
entityManager.flush();
Person tempPerson = getPerson(user);
entityManager.remove(tempPerson);
entityManager.getTransaction().commit();
}
但现在我仍然检索旧引用,尽管表中的数据已删除。我检索该数据:
entityManager.find(Person.class, user);
您需要先删除所有帖子和 vrienden(关系 - 可能是中间人 table)然后删除当前人员(因为外键约束不允许您这样做 - 来自不同 [的许多其他行=17=] 可能取决于这个table.
您不能删除在其他人的列表中作为朋友存在的人。首先,您应该将其从其他人对象(数据库中的行)的所有好友列表 (vrienden) 中删除,然后再将其删除。错误消息清楚地表明您不能删除行,因为该记录在其他 table.
中是 FK
情况:试图删除拥有一组人(朋友)的人。当然我不希望朋友被删除所以我必须小心。
个人代码:
@Entity
public class Person {
private String naam, voornaam, email, password;
@Id
private String username;
private String status;
@ManyToMany
private Collection<Person> vrienden;
@OneToMany(orphanRemoval = true)
private Collection<Post> posts;
@Enumerated(EnumType.STRING)
private Role role;
public Person(String naam, String voornaam, String email, String password, String username) {
setNaam(naam);
setEmail(email);
setStatus("online");
setVoornaam(voornaam);
setPassword(password);
setUsername(username);
vrienden = new HashSet<>();
posts = new HashSet<>();
role = Role.USER;
}
public static void addFriend(Person a, Person b) {
a.addFriend(b);
b.addFriend(a);
}
private void addFriend(Person b) {
this.vrienden.add(b);
}
public static void deleteFriend(Person a, Person b) {
a.deleteFriend(b);
b.deleteFriend(a);
}
private void deleteFriend(Person a) {
this.vrienden.remove(a);
}
public Collection<Person> getFriends() {
return vrienden;
}
public Role getRole() {
return this.role;
}
public void setRole(Role role) {
this.role = role;
}
@NotNull(message = "{error.no.name}")
@Size(min = 2, message = "{error.invalid.namesize}")
public String getNaam() {
return naam;
}
public void setNaam(String naam) {
this.naam = naam;
}
@NotNull(message = "{error.no.surnaam}")
@Size(min = 2, message = "{error.invalid.surnamesize}")
public String getVoornaam() {
return voornaam;
}
public void setVoornaam(String voornaam) {
this.voornaam = voornaam;
}
@NotNull(message = "{error.no.email}")
@Email(message = "{error.invalid.email}")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@NotNull(message = "{error.no.status}")
@Size(min = 1, message = "{error.no.valid.status}")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@NotNull(message = "{error.no.username}")
@Size(min = 2, message = "{error.invalid.usernamesize}")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = Password.getSaltedHash(password);
}
public boolean isPasswordCorrect(String password) {
boolean result = false;
result = Password.check(password, this.password);
return result;
}
@NotNull(message = "{error.no.password}")
@Size(min = 2, message = "{error.invalid.usernamesize}")
public String getPassword() {
return this.password;
}
public void addPost(Post p) {
if (p == null) {
throw new DomainException("Post is null");
}
posts.add(p);
}
public void deletePost(Post p) {
if (p == null) {
throw new DomainException("Post is null");
}
posts.remove(p);
}
public Collection<Post> getPosts() {
return posts;
}
@Override
public int hashCode() {
int hash = 3;
hash = 59 * hash + Objects.hashCode(this.username);
return hash;
}
public void setHashedPassword(String password) {
this.password = password;
}
}
我目前使用的方法是:
public void DeletePerson(String user) {
entityManager.getTransaction().begin();
entityManager.createQuery("delete from Person p where p.username=:username").setParameter("username", user).executeUpdate();
entityManager.getTransaction().commit();
}
它给出了以下错误:
java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'PERSON' caused a violation of foreign key constraint 'PRSNPRSNVRNDNSRNME' for key (vincent). The statement has been rolled back.
我的猜测是在 manytomany 注释中添加一些东西
创建表: https://i.stack.imgur.com/zS2Xf.png
更新:
我现在使用的删除成功代码:
public void DeletePerson(String user) {
entityManager.getTransaction().begin();
entityManager.createNativeQuery("delete from PERSON_PERSON p where p.PERSON_USERNAME=?username or p.VRIENDEN_USERNAME=?username").setParameter("username", user).executeUpdate();
entityManager.flush();
Person tempPerson = getPerson(user);
entityManager.remove(tempPerson);
entityManager.getTransaction().commit();
}
但现在我仍然检索旧引用,尽管表中的数据已删除。我检索该数据:
entityManager.find(Person.class, user);
您需要先删除所有帖子和 vrienden(关系 - 可能是中间人 table)然后删除当前人员(因为外键约束不允许您这样做 - 来自不同 [的许多其他行=17=] 可能取决于这个table.
您不能删除在其他人的列表中作为朋友存在的人。首先,您应该将其从其他人对象(数据库中的行)的所有好友列表 (vrienden) 中删除,然后再将其删除。错误消息清楚地表明您不能删除行,因为该记录在其他 table.
中是 FK