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 消息包含该用户的消息,并且该列表中的每条消息都具有该用户的“收件人”字段。所有这些都正确地保留了下来。但是,当我运行 deleteMessage 方法时,第一个 sysout 正确给出了完整列表,而第二个 sysout 只给出了 null 而不是没有删除消息的列表。

我不知道它是否与 jpa 有关,或者我只是犯了一个愚蠢的错误,但我找不到 remove 方法只是删除整个 ArrayList 的原因。当我调用 deleteMessage 函数时,我还调用实体管理器的 remove 方法从数据库中删除消息。

更新

经过更多测试后,我注意到第二个 sysout 确实给出了正确的输出。所以问题不在于 ArrayList 中的 remove 方法。但是arraylist在执行以下方法后变为null。

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

所以现在我知道这是一个 JPA 问题。

4

2 回答 2

0

您似乎在说的是,之前messages.remove()messages对列表的引用,但之后引用为空。如果这是真的,那么可能性是相当有限的。可能有另一个线程正在修改状态,或者可能发生了一些面向方面的魔法。您可能会从尝试提供 SSCCE中受益,因为您将在此过程中自己发现问题。

于 2012-04-25T16:15:50.877 回答
0

我通过将必须删除的消息的to字段重置为空来解决了这个问题。这样双向连接就被破坏了。如果我再次从上面运行deleteMessage方法,则 ArrayList 不会更改为 null 并且一切正常。

于 2012-04-26T09:14:08.090 回答