春季数据:OneToMany问题,孩子未正确保存

时间:2018-11-09 10:37:09

标签: java hibernate jpa orm spring-data

我在处理@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

为什么保存CompteTypeMouvementTypeMouvement的属性没有填写?

1 个答案:

答案 0 :(得分:2)

您正在尝试通过已存在的实体调用保存:

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);
    }
}

这意味着将调用merge而不是persist

如果您添加merge以进行级联,它应该可以工作:

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