我有一个名为FileSet的实体,其中包含一个名为File:
的实体列表@Entity
@Table(name = "FILESET")
public class FileSet {
@Id
@Column(name = "ID", nullable = false)
private String id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "FILESET_MAPPING", //
joinColumns = @JoinColumn(name = "FILESET_ID"), //
inverseJoinColumns = @JoinColumn(name = "FILE_ID"))
private Collection<File> files = Lists.newArrayList();
...
}
文件实体本身:
@Entity
@Table(name = "FILE")
public class File {
@Id
@Column(name = "FILE_NUMBER", nullable = false)
private String fileNumber;
...
}
现在我要做的是更新文件集中的文件列表。为此,我使用相同的fileNumber创建新的(分离的)File对象,并将其替换为列表:
String fileNumberToReplace = "123";
File newFile = new File(fileNumberToReplace);
fileSet.getFiles().removeIf(file -> Objects.equals(fileNumberToReplace, file.getFileNumber()));
fileSet.getFiles().add(newFile);
entityManager.merge(fileSet);
我原以为自从CascadeType.ALL处于活动状态时,JPA会自动合并列表中的分离元素。但是,我正在成为例外:
Multiple representations of the same entity are being merged
然后我尝试单独合并列表中的元素,然后在此之后设置文件:
fileSet.getFiles().forEach(entityManager::merge);
entityManager.merge(fileSet);
这没有用。我对JPA很新,所以我不确定我做错了什么。有人可能会指出我正确的方向吗?