PersistentObjectException:传递给persist的分离实体:com.edge.le.domain.Tag

时间:2017-03-21 09:18:23

标签: java spring hibernate jpa

我有一个_ref3实体与Goal有很多关系。这里Tag是我自己的实体。我正在使用JPA来坚持。当我使用现有Goal保存PersistentObjectException时,它会给Goal。其他方案(如新Tag使用新Gaol,使用现有Tag编辑现有Goal,使用新Tag编辑现有Goal等工作正常。下面是我的实体结构:

Goal.java

Tag

Tag.java

@Entity
@Table(name = "goal")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "goal")
public class Goal implements Serializable {

private static final long serialVersionUID = 1L;

@ManyToMany(cascade = {
         CascadeType.MERGE,
         CascadeType.PERSIST,
    },targetEntity = Tag.class)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "goal_tag",
           joinColumns = @JoinColumn(name="goals_id",      referencedColumnName="ID"),
           inverseJoinColumns = @JoinColumn(name="tags_id", referencedColumnName="ID"))
private Set<Tag> tags = new HashSet<>();

 //getters &  setters

GoaServiceImpl.java save()方法

 @Entity
 @Table(name = "tag")
 @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
 @Document(indexName = "tag")
 public class Tag implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private String id;

@ManyToMany(mappedBy = "tags")
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Goal> goals = new HashSet<>();

 //getters & setters

} 请帮帮我。

1 个答案:

答案 0 :(得分:0)

当您尝试使用save时,持久性提供程序尝试级联的操作是PERSIST。当您尝试保留已分离的现有实体时,您最终会遇到该异常。

由于你在该关系上设置了MERGE级联选项,我建议使用merge而不是persist:

goal = goalRepository.merge(goal);

现在,如果您的目标是一个新实体,它将被保留并分离标记实体将被合并(如果持久性提供者发现状态发生变化,则更新)。