You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决JPA中‘Multiple representations of the same entity’异常?

问题:JPA一对多关联插入多条数据时出现重复实体错误

我是JPA新手,在向ParticipantesEntity表插入多条数据时遇到错误。ConcursoEntity与ParticipantesEntity为OneToMany关联关系,尝试在ParticipantesEntity中添加@ManyToOne关联后仍报错。

实体代码

public class ConcursoEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CONCURSO_ID_GEN")
    @SequenceGenerator(name = "CONCURSO_ID_GEN", sequenceName = "CONCURSO_SEQ", initialValue = 1, allocationSize = 1)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;
        
    @Column(name = "PREMIO")
    private String premio;
    
    @Column(name = "RUT")
    private String rut;
    
    @Column(name = "FECHA_ACTUALIZACION")
    private Timestamp fechaActualizacion;
    
    @Column(name = "DIRECCION")
    private String direccion;
    
    @Column(name = "COMUNA")
    private String comuna;
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "ID", referencedColumnName = "id")
    private List<ParticipantesEntity> pticipantes;
    
}

public class ParticipantesEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PARTICIPANTES_ID_GEN")
    @SequenceGenerator(name = "PARTICIPANTES_ID_GEN", sequenceName = "PARTICIPANTES_SEQ", initialValue = 1, allocationSize = 1)
    @Column(name = "ID", unique = false, nullable = false)
    private Long id;
    
    @Column(name = "RUT")
    private String rut;
    
    @Column(name = "TIPO_PARTICIPANTE")
    private String tipoParticipante;
}

错误信息

org.springframework.dao.InvalidDataAccessApiUsageException: Multiple representations of the same entity [cl.bch.cloud.ms.grts.web.entities.ParticipantesEntity#1] are being merged. Detached: [ParticipantesEntity(id=1, rut=216956245, tipoParticipante=PROPIETARIO)]; Detached: [ParticipantesEntity(id=1, rut=156324865, tipoParticipante=AVAL)]; nested exception is java.lang.IllegalStateException: Multiple representations of the same entity [cl.bch.cloud.ms.grts.web.entities.ParticipantesEntity#1] are being merged. Detached: [ParticipantesEntity(id=1, rut=216956245, tipoParticipante=PROPIETARIO)]; Detached: [ParticipantesEntity(id=1, rut=156324865, tipoParticipante=AVAL)]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:371)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)

请求体内容

{
   "id":1,
   "premio":"auto",
   "rut":"162332112",
   "direccion":"LOS JACINTOS 374",
   "comuna":"VALPARAISO",
   "participantes":[
      {
        "id": 1,
         "rut":"156324865",
         "tipoParticipante":"AVAL"
      },
      {
          "id": 1,
         "rut":"216956245",
         "tipoParticipante":"PROPIETARIO"
      }
   ]
}

问题根源

  1. 请求体错误:两个ParticipantesEntity的id都设为1,JPA中@Id是实体的唯一标识,这会让JPA判定这是同一个实体的两个不同实例,触发合并冲突。
  2. 实体关联配置问题:
    • ConcursoEntity中集合字段名称拼写错误(pticipantes应为participantes)
    • @JoinColumn的name配置错误,应该指向ParticipantesEntity中关联Concurso的外键字段(而非自身主键ID)
    • 双向关联未正确配置,缺少ParticipantesEntity到ConcursoEntity的@ManyToOne关联

修复方案

1. 修正请求体

由于ParticipantesEntity的主键是自增序列,不需要手动指定id,直接移除该字段即可:

{
   "id":1,
   "premio":"auto",
   "rut":"162332112",
   "direccion":"LOS JACINTOS 374",
   "comuna":"VALPARAISO",
   "participantes":[
      {
         "rut":"156324865",
         "tipoParticipante":"AVAL"
      },
      {
         "rut":"216956245",
         "tipoParticipante":"PROPIETARIO"
      }
   ]
}

2. 修正实体关联配置

public class ConcursoEntity {
    // 其他字段保持不变
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "concurso")
    private List<ParticipantesEntity> participantes;
    
    // 初始化集合避免空指针
    public ConcursoEntity() {
        this.participantes = new ArrayList<>();
    }

    // 添加getter、setter方法
}

public class ParticipantesEntity {
    // 其他字段保持不变
    
    @ManyToOne
    @JoinColumn(name = "CONCURSO_ID") // 外键字段名称,需与数据库表结构一致
    private ConcursoEntity concurso;

    // 添加getter、setter方法
}

3. 维护关联关系

保存ConcursoEntity前,确保每个ParticipantesEntity都关联到当前Concurso实例:

// 示例保存代码
ConcursoEntity concurso = // 从请求体转换或构建实例
for (ParticipantesEntity participante : concurso.getParticipantes()) {
    participante.setConcurso(concurso);
}
concursoRepository.save(concurso);

内容的提问来源于stack exchange,提问作者Sftc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:05:26