Spring JPA удаляет связь @OneToOne

#hibernate #spring-boot #spring-mvc #jpa #spring-data-jpa

#переход в спящий режим #весенняя загрузка #spring-mvc #jpa #spring-data-jpa

Вопрос:

У меня есть приложение веб-службы SpringBoot 2.1.3.RELEASE RESTful., использующее инициализатор Spring, встроенный Tomcat, механизм шаблонов Thymeleaf и пакет в виде исполняемого JAR-файла, у меня есть этот объект:

 public class ImpactHint implements Serializable {



    @OneToOne(mappedBy = "impactHint", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "IA_ID")
    private ImpactHintAmendment amendment ;


...

}
  

а также

 public class ImpactHintAmendment implements Serializable, IEntity<String> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    private String id;

    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "IA_ID")
    private ImpactHint impactHint;  
..
}
  

Я пытаюсь удалить, используя

 em.remove(impactHint.getAmendment());
em.persist(impactHint);
  

а также

 impactHint.setAmendment(null);
em.persist(impactHint);
  

в моем классе репозитория, но ничего не работает

 @Repository
public class ImpactHintDao extends AbstractDao<ImpactHint, String> implements IImpactHintDao {


    @PersistenceContext
    private EntityManager em;

   ..
}
  

Ответ №1:

Для двунаправленного использования OneToOne используйте mappedBy атрибут для определения обратного отображения. Объект-владелец ImpactHint использует @JoinColumn и имеет столбец FK. Второй объект:

 public class ImpactHintAmendment {
    @OneToOne(mappedBy = "amendment")
    private ImpactHint impactHint; 
  

Если вы исправите свое сопоставление, то произойдет удаление сирот. следует удалить Amendment без вызова remove

 impactHint.setAmendment(null);
em.persist(impactHint);