У меня проблема, когда я хочу сохранить сущность "TablasMaestra", которая содержит отношение OneToMany сущностей "DatosMaestro".Я создаю объект MasterTables и вставляю список новых сущностей «MasterData».
Все объекты «DatosMaestro» имеют нулевой идентификатор, потому что они являются новыми объектами.
Когда я вызываю метод saveTablasMaestra, егокогда мне возвращается исключение:
Caused by: javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.soprasteria.mater.entity.DatosMaestro#com.soprasteria.mater.entity.DatosMaestroPK@3fd1]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:118)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
Я прилагаю код сущностей и услуг.
package com.soprasteria.mater.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* The persistent class for the tablas_maestras database table.
*
*/
@Entity
@Table(name="tablas_maestras")
@NamedQuery(name="TablasMaestra.findAll", query="SELECT t FROM TablasMaestra t")
public class TablasMaestra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int id;
@Column(name="descripcion_castellano", length=255)
private String descripcionCastellano;
@Column(name="descripcion_catalan", length=255)
private String descripcionCatalan;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_baja")
private Date fechaBaja;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_creacion")
private Date fechaCreacion;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_modificacion")
private Date fechaModificacion;
@Column(name="usuario_baja", length=45)
private String usuarioBaja;
@Column(name="usuario_creacion", length=45)
private String usuarioCreacion;
@Column(name="usuario_modificacion", length=45)
private String usuarioModificacion;
//bi-directional many-to-one association to DatosMaestro
@OneToMany(mappedBy="tablasMaestra", cascade = CascadeType.ALL, orphanRemoval = true)
private List<DatosMaestro> datosMaestros;
public TablasMaestra() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getDescripcionCastellano() {
return this.descripcionCastellano;
}
public void setDescripcionCastellano(String descripcionCastellano) {
this.descripcionCastellano = descripcionCastellano;
}
public String getDescripcionCatalan() {
return this.descripcionCatalan;
}
public void setDescripcionCatalan(String descripcionCatalan) {
this.descripcionCatalan = descripcionCatalan;
}
public Date getFechaBaja() {
return this.fechaBaja;
}
public void setFechaBaja(Date fechaBaja) {
this.fechaBaja = fechaBaja;
}
public Date getFechaCreacion() {
return this.fechaCreacion;
}
public void setFechaCreacion(Date fechaCreacion) {
this.fechaCreacion = fechaCreacion;
}
public Date getFechaModificacion() {
return this.fechaModificacion;
}
public void setFechaModificacion(Date fechaModificacion) {
this.fechaModificacion = fechaModificacion;
}
public String getUsuarioBaja() {
return this.usuarioBaja;
}
public void setUsuarioBaja(String usuarioBaja) {
this.usuarioBaja = usuarioBaja;
}
public String getUsuarioCreacion() {
return this.usuarioCreacion;
}
public void setUsuarioCreacion(String usuarioCreacion) {
this.usuarioCreacion = usuarioCreacion;
}
public String getUsuarioModificacion() {
return this.usuarioModificacion;
}
public void setUsuarioModificacion(String usuarioModificacion) {
this.usuarioModificacion = usuarioModificacion;
}
public List<DatosMaestro> getDatosMaestros() {
return this.datosMaestros;
}
public void setDatosMaestros(List<DatosMaestro> datosMaestros) {
this.datosMaestros = datosMaestros;
}
public DatosMaestro addDatosMaestro(DatosMaestro datosMaestro) {
getDatosMaestros().add(datosMaestro);
datosMaestro.setTablasMaestra(this);
return datosMaestro;
}
public DatosMaestro removeDatosMaestro(DatosMaestro datosMaestro) {
getDatosMaestros().remove(datosMaestro);
datosMaestro.setTablasMaestra(null);
return datosMaestro;
}
@PrePersist
private void prePersiste() {
for(DatosMaestro datosMaestro:this.datosMaestros) {
if(datosMaestro.getId()==null) {
datosMaestro.setId(new DatosMaestroPK());
}
datosMaestro.setTablasMaestra(this);
}
}
}
private void cargaDatosMaestro(String tabla) {
TablasMaestraDTO tablaMaestra = new TablasMaestraDTO();
tablaMaestra.setDescripcionCastellano(tabla);
tablaMaestra.setDescripcionCatalan(tabla);
List<DatoMaestroDTO> listDatoMaestro= new ArrayList<DatoMaestroDTO>();
for(int i=0;i<4;i++) {
DatoMaestroDTO datoMaestro = new DatoMaestroDTO();
datoMaestro.setDescripcionCastellano(tabla+i);
datoMaestro.setDescripcionCatalan(tabla+ i +" cat");
datoMaestro.setTablaMaestra(tablaMaestra);
listDatoMaestro.add(datoMaestro);
}
tablaMaestra.setDatosMaestros(listDatoMaestro);
tablaMaestra=insertTablaMaestra(tablaMaestra);
}
private TablasMaestraDTO insertTablaMaestra(TablasMaestraDTO tablaMaestra) {
tablaMaestra.setFechaCreacion(new Date());
tablaMaestra=tablasMaestraService.saveTablasMaestra(tablaMaestra);
return tablaMaestra;
}
/**
* Graba en base de datos la entidad TablasMaestra
*
* @param TablasMaestraDTO
* @return TablasMaestraDTO
*/
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public TablasMaestraDTO saveTablasMaestra(TablasMaestraDTO dto) {
TablasMaestra entity = new ModelMapper().map(dto, TablasMaestra.class);
entity=tablasMaestrasRepository.save(entity);
if (entity != null) {
dto = new ModelMapper().map(entity, TablasMaestraDTO.class);
}
return dto;
}
package com.soprasteria.mater.entity;
import java.io.Serializable;
import javax.persistence.*;
/**
* The primary key class for the datos_maestros database table.
*
*/
@Embeddable
public class DatosMaestroPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
@Column(name="id", unique=true, nullable=false)
private int id_pk;
@Column(name="tablas_maestras_id_tabla", insertable=false, updatable=false, unique=true, nullable=false)
private int tablasMaestrasIdTabla;
public DatosMaestroPK() {
}
public int getId_pk() {
return this.id_pk;
}
public void setId_pk(int id_pk) {
this.id_pk = id_pk;
}
public int getTablasMaestrasIdTabla() {
return this.tablasMaestrasIdTabla;
}
public void setTablasMaestrasIdTabla(int tablasMaestrasIdTabla) {
this.tablasMaestrasIdTabla = tablasMaestrasIdTabla;
}
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof DatosMaestroPK)) {
return false;
}
DatosMaestroPK castOther = (DatosMaestroPK)other;
return
(this.id_pk == castOther.id_pk)
&& (this.tablasMaestrasIdTabla == castOther.tablasMaestrasIdTabla);
}
public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + this.id_pk;
hash = hash * prime + this.tablasMaestrasIdTabla;
return hash;
}
}
package com.soprasteria.mater.repository;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import com.soprasteria.mater.entity.DatosMaestro;
import com.soprasteria.mater.entity.TablasMaestra;
public interface TablasMaestrasRepository extends CrudRepository<TablasMaestra, Integer>{
@Query(value = "select count(*) from TablasMaestra tablasMaestra where tablasMaestra.id = ?1")
long subtaskNumber(int datosMaestroId);
@Query(value = "select max(tablasMaestra.id) from TablasMaestra tablasMaestra")
long lastDatosMaestroId();
@Query(value="select tablasMaestra from TablasMaestra tablasMaestra order by id desc")
public List<DatosMaestro> findAllByOrderByCreatedOnDesc();
}