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 NewTag
,用现有的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);