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

Java PersistentObjectException:传递给persist的分离实体:com.edge.le.domain.Tag,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有一个目标实体,它与标记有多对多关系。这里的目标是我拥有的实体。我用JPA来坚持。当我使用现有的标记保存目标时,它会给出PersistentObjectException。其他场景,如新的Gaolwih NewTag,用现有的Tag编辑现有的Goal,现有的Goal和新的Tag工作正常。以下是我的实体结构: Goal.java } 请帮帮我 当您尝试使用save时,持久性提供程序尝试级联的操作是PERSIST。当您试图持久化已分离的现有实体时,最终会出现该异常 由于在该关系上设置了“合并级联”

我有一个
目标
实体,它与
标记
有多对多关系。这里的
目标
是我拥有的实体。我用JPA来坚持。当我使用现有的
标记保存
目标时,它会给出
PersistentObjectException
。其他场景,如新的
Gaol
wih New
Tag
,用现有的
Tag
编辑现有的
Goal
,现有的
Goal
和新的
Tag
工作正常。以下是我的实体结构:

Goal.java }
请帮帮我

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

由于在该关系上设置了“合并级联”选项,我建议使用“合并”而不是“持久化”:

goal = goalRepository.merge(goal);

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

当您尝试使用
save
时,持久化提供程序尝试级联的操作是
持久化
。当您试图持久化已分离的现有实体时,最终会出现该异常

由于在该关系上设置了“合并级联”选项,我建议使用“合并”而不是“持久化”:

goal = goalRepository.merge(goal);

现在,如果您的目标是一个新实体,那么它将被持久化,分离的标记实体将被合并(如果持久化提供程序发现状态发生变化,则会进行更新)。

我正在使用JpaRepository。公共接口GoalRepository扩展了JpaRepository{},并且它没有合并方法。但我直接使用EntityManager的merge()方法。这是正确的方法还是其他方法?理论上,框架应该检查实体是否是新的,如果不是,则调用merge而不是save。这不是第一次因为某种原因而不起作用。。因此,我建议您创建自己的自定义存储库,在其中保存合并方法。因此,基线是不要将实体管理器注入到您的服务中。。将其注入存储库,然后将存储库注入我正在使用的JpaRepository服务。公共接口GoalRepository扩展了JpaRepository{},并且它没有合并方法。但我直接使用EntityManager的merge()方法。这是正确的方法还是其他方法?理论上,框架应该检查实体是否是新的,如果不是,则调用merge而不是save。这不是第一次因为某种原因而不起作用。。因此,我建议您创建自己的自定义存储库,在其中保存合并方法。因此,基线是不要将实体管理器注入到您的服务中。。将其注入存储库,然后将存储库注入服务
 public class GoalServiceImpl implements GoalService{

private final Logger log = LoggerFactory.getLogger(GoalServiceImpl.class);

@Inject
private GoalRepository goalRepository;

@Inject
private GoalMapper goalMapper;

@Inject
private GoalSearchRepository goalSearchRepository;

@Inject
private TagRepository tagRepository;

/**
 * Save a goal.
 *
 * @param goalDTO the entity to save
 * @return the persisted entity
 */
  public GoalDTO save(GoalDTO goalDTO) {
    log.debug("Request to save Goal : {}", goalDTO);
    Goal goal = goalMapper.goalDTOToGoal(goalDTO);
    goal = goalRepository.save(goal);
    GoalDTO result = goalMapper.goalToGoalDTO(goal);
    //goalSearchRepository.save(goal);
    return result;
}
goal = goalRepository.merge(goal);