Дочерняя сущность Spring Data JPA отсутствует родительский идентификатор после транзитивного сохранения

#java #spring #spring-data-jpa

#java #spring #spring-data-jpa

Вопрос:

У меня следующая структура классов

 @Entity
@Data // lombok
public class Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "entity_details_id", referencedColumnName = "id")
    @JsonManagedReference(value = "entityDetails")
    private EntityDetails entityDetails;
    
}

@Entity
@Data
public class EntityDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne(mappedBy = "entityDetails")
    @JsonBackReference(value = "entityDetails")
    private Entity entity;
    
    // Some more fields

    @OneToMany(mappedBy = "entityDetails", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference(value = "childEntityDetails")
    private List<Child> childList;
    
}

@Entity
@Data
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "description")
    private String description;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "entity_details_id")
    @JsonBackReference(value = "childEntityDetails)
    private EntityDetails entityDetails;
    
}
  

Предположим, у меня есть объект Entity со следующей структурой:

Сущность{ id: null, entityDetails: { id: null, дочерний список: [ { id: null, описание: «ch1» }, { id: null, описание: «ch2» } ] } }

Когда я вызываю entityRepository.save(entity) , все объекты сохраняются, но в Child таблице нет значения для entity_details_id . Другие значения верны (я Entity.entity_details_id правильно установил), но это не работает. Я не уверен, что я что-то упускаю или я просто делаю это неправильно.

Комментарии:

1. попробуйте добавить @JoinColumn(name = "entity_details_id") в EntityDetails и удалить его из Child класса

2. @silentsudo вы не можете иметь @JoinColumn в mappedBy поле

3. конечно, путем удаления ассоциации