2017-05-12 2 views
0

Sitiuation:人物(友人)のコレクションを持つ人物を削除しようとしています。 Ofcourse私は友人が削除されることを望んでいないので、私はそれに注意する必要があります。人のためのmanytomanyコレクションを持つオブジェクトを削除します。

コード:

@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

UPDATE:

私は正常に削除するために、今使っコード:

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); 
+1

JPAをちょっと残して、SQLについて考えてみてください。 Person行を削除する前に、関連テーブルのキーを管理する必要があります。あなたのスキーマはどのように見えますか?あなたのために生成されたSQLはどのように見えますか? – duffymo

+0

は、生成されたテーブルの画像を追加しました@duffymo – VincentN

+0

これはスタートです。次に、JPAが生成するSQLを見てみましょう。 Person行を削除しようとする前に、友達として削除するPersonを持つ多対多表の行をすべて削除する必要があります。単一の作業単位でなければなりません。 – duffymo

答えて

0

あなたが他の人のリストに友人として存在する人物を削除することはできません。まず、あなたが他の人に、すべての友人リスト(vrienden)からそれを削除する必要がありますオブジェクト(行はdb)以上 それを除く。エラーメッセージは、そのレコードが他のテーブルのFKであるため、行を削除できないことを明確に示しています。

+0

を変更します(dbで手動でデータをチェックしました) 、私はまだ何らかの理由で、任意のアイデアのために削除されたオブジェクトを取得することができますか? @ nick79 – VincentN

+0

うーん...奇妙な...あなたは本当ですか?たとえば、ローカル変数にインスタンスを保存した可能性はありますか、EntityManagerを使用してそのオブジェクトを再度取得できますか? – nick79

+0

このようなオブジェクトを削除しようとするとどうなりますか? Person toBeDeleted = entityManager.findByUsername(user) entityManager.remove(toBeDeleted) – nick79

0

あなたはまず、すべての記事とvrienden(たぶん、いくつかの中間テーブルの関係)を削除する必要があります。私はとのデータがあること取り出します別のテーブルからの行は、この表に依存してもよい。

https://stackoverflow.com/a/1089008/5284920

関連する問題