まず、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の問題であることを知っています。