同一实体的多个表示形式正在与@OneToMany合并

时间:2019-02-18 19:45:38

标签: postgresql spring-boot jpa

我有一个使用Spring Boot构建的Web应用程序,该应用程序与db PostgreSql连接,该项目是关于教育机构的,它管理学生和发票...

我手动生成所有发票。我通常会添加第一个cuota(发票),但是当我想生成第二个cuota(发票)时,就会遇到此问题:

java.lang.IllegalStateException: Multiple representations of the same entity [com.codeboros.app.entity.Cuota#1] are being merged. Detached: [com.codeboros.app.entity.Cuota@1788e1df]; Managed: [com.codeboros.app.entity.Cuota@2697e3fc]

我有这个实体:

@Entity
@Table(name="ALUMNOS")
public class Alumno implements Serializable {           
    @OneToMany(mappedBy="alumno", cascade= {CascadeType.DETACH,CascadeType.PERSIST,CascadeType.DETACH,CascadeType.REMOVE,CascadeType.REFRESH,CascadeType.MERGE}, fetch=FetchType.LAZY)
    @NotFound(action = NotFoundAction.IGNORE)
    @JsonIgnore 
    private List<Cuota> cuotas;
}

@Entity
@DiscriminatorValue(value="Cuota")
public class Cuota extends Factura implements Serializable  {
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="alumno_cod")
    @NotFound(action = NotFoundAction.IGNORE) 
    Alumno alumno;
}

还有AlumnoController

@PostMapping("/alumnoGenCuota/{id}")    
public String GenCuota(@PathVariable Long id, Cuota cuota) {
    Alumno alumno = alumnoService.get(id);
    cuota.setAlumno(alumno);
    cuota.setMonto(alumno.getCurso().getCuota()); 
    cuota.setDetalle(alumno.getCurso().getNombre()+":  $"+alumno.getCurso().getCuota()); //detalle
    alumno.AgregarCuota(cuota);             

    alumnoService.save(alumno);

    return "redirect:/alumnocuotas/"+id;
}

我试图删除CascadeType.MERGE,但没有保存消息Cuotas

1 个答案:

答案 0 :(得分:0)

如果您没有使用Hibernate,请从不允许您持久保留分离的实体的实体中删除CascadeType.MERGE或放置CascadeType.MERGE以外的所有级联类型

如果您使用的是Hibernate,请将以下行添加到persistence.xml-

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

设置hibernate.event.merge.entity_copy_observer=allow时,Hibernate将在级联合并操作时合并检测到的每个实体副本。在合并每个实体副本的过程中,Hibernate将从每个实体副本到其与cascade=CascadeType.MERGECascadeType.ALL的关联的合并操作进行级联。合并另一个实体副本时,合并一个实体副本所导致的实体状态将被覆盖。