Spring Data: проблема с OneToMany, дочерний элемент не сохранен должным образом - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблемы с отношениями @OneToMany.

Вот мой код:

@Entity
@Table(name = "type_mouvement")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class TypeMouvement implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="typeMouvement", fetch = FetchType.EAGER,cascade = CascadeType.PERSIST)
    private List<CompteTypeMouvement> comptes;
...
}

@Entity
@Table(name = "type_mouvement_comptes")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class CompteTypeMouvement implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String numCompte;

    @ManyToOne
    private TypeMouvement typeMouvement;
...
}

Как я использую эти сущности:

TypeMouvement typeMouvementFromDB = typeMouvementRepository.findOne(new Long(1));
CompteTypeMouvement compte = new CompteTypeMouvement();
compte.setNumCompte("123");
compte.setTypeMouvement(typeMouvementFromDB);
typeMouvementFromDB.getComptes().add(compte);
typeMouvementRepository.save(typeMouvementFromDB);

Результат, который я получаю:

enter image description here

Я думал, что получу:

enter image description here

Почему свойства CompteTypeMouvement не заполняются при сохранении TypeMouvement?

1 Ответ

0 голосов
/ 09 ноября 2018

Вы пытаетесь вызвать save, передавая уже существующую сущность:

TypeMouvement typeMouvementFromDB = typeMouvementRepository.findOne(new Long(1));
typeMouvementRepository.save(typeMouvementFromDB);

Отношение имеет только постоянный каскадный тип, хотя:

@OneToMany(mappedBy="typeMouvement", fetch = FetchType.EAGER,cascade = CascadeType.PERSIST)
private List<CompteTypeMouvement> comptes;

Сохранение подразумевается следующим образом (spring-data-jpa-1.11.3):

public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

Это означает, что вместо persist будет вызываться merge.

Это если вы добавите merge к каскаду, он должен работать:

@OneToMany(mappedBy="typeMouvement", fetch = FetchType.EAGER,
  cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<CompteTypeMouvement> comptes;
...