2

まず、2 つのエンティティがあります。

ユーザー.java

@Entity
public class User { 
    @Id
    private String username;
    private String password;
    @OneToMany(mappedBy = "to", cascade=CascadeType.PERSIST, orphanRemoval=true)
    private ArrayList<Message> messages;
}

public void deleteMessage(Message message){
        System.out.println(messages);
        messages.remove(message);
        System.out.println(messages);
}

メッセージ.java

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private String id;
    @ManyToOne
    @NoGson
    private User to;
}

ArrayList メッセージには、そのユーザーへのメッセージが含まれており、そのリスト内のすべてのメッセージには、そのユーザーの「to」フィールドがあります。これはすべて正しく保持されます。ただし、deleteMessage メソッドを実行すると、最初の sysout は完全なリストを正しく提供し、2 番目の sysout は削除されたメッセージのないリストの代わりに null を提供します。

それがjpaと関係があるのか​​ 、それとも私が愚かな間違いを犯しているだけなのかはわかりませんが、removeメソッドがArrayList全体を削除する理由を見つけることができません. deleteMessage 関数を呼び出すときに、エンティティ マネージャーの remove メソッドも呼び出して、データベースからメッセージを削除します。

アップデート

さらにテストした後、2 番目の sysout が正しい出力を提供することに気付きました。したがって、問題は ArrayList からの remove メソッドではありません。ただし、次のメソッドを実行すると、arraylist は null になります。

public void deleteMessage(Message message) {
    em.remove(message);
} 

だから今、私はそれがJPAの問題であることを知っています。

4

2 に答える 2

0

削除する必要があるメッセージのtoフィールドを nullにリセットすることで問題を解決しました。このようにして、双方向接続が切断されます。上からもう一度deleteMessageメソッドを実行すると、ArrayList は null に変化せず、すべて正常に動作します。

于 2012-04-26T09:14:08.090 に答える
0

あなたが言っているように見えるのは、 before messages.remove(),messagesはリストへの参照ですが、その後、参照は null です。それが本当なら、可能性はかなり限られています。別のスレッド変更状態があるか、アスペクト指向の魔法が発生している可能性があります。途中で自分で問題を発見するので、 SSCCE を提供しようとすることでおそらく恩恵を受けるでしょう。

于 2012-04-25T16:15:50.877 に答える