Bom dia, estou postado este problema no avançado pois não consegui resolver por meio do básico.
Seguinte, tenho uma aplicação Swing com acesso ao banco PostgreSQL por meio de JPA. Todas as classes de entidades foram geradas automaticamente pelo Netbeans, porém, após reconfigurar algumas classes o IDE passou a apresentar o seguinte erro:
Descriptor Exceptions:
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [dbsghu.dbsghu.porte_valores.nr_porte]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[porte]
Descriptor: RelationalDescriptor(entidades.PorteValores --> [DatabaseTable(dbsghu.dbsghu.porte_valores)])
Runtime Exceptions:
[EL Info]: connection: 2013-06-21 12:41:19.713–ServerSession(1384085424)–file:/A:/Projetos/Java/Desktop/AcessoDados/store/AcessoDados.jar_SGHUPU logout successful
[EL Severe]: ejb: 2013-06-21 12:41:19.718–ServerSession(1384085424)–Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions:
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [dbsghu.dbsghu.porte_valores.nr_porte]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[porte]
Descriptor: RelationalDescriptor(entidades.PorteValores --> [DatabaseTable(dbsghu.dbsghu.porte_valores)])
Runtime Exceptions:
21/06/2013 12:41:45 - FATAL - [main] - (FabricaEntidade.java:135) - persistencia.FabricaEntidade.criarGestor(FabricaEntidade.java:135) - Ocorreu um erro ao instanciar a fábrica.
javax.persistence.PersistenceException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [SGHUPU] failed. Close all factories for this PersistenceUnit.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions:
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [dbsghu.dbsghu.porte_valores.nr_porte]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[porte]
Descriptor: RelationalDescriptor(entidades.PorteValores --> [DatabaseTable(dbsghu.dbsghu.porte_valores)])
Runtime Exceptions:
Sei que o erro é devido ter vários relacionamentos definidos como escrita para um único campo, porém, não sei como resolver de forma que eu possa realizar o comando de insert em cascata.
Segue parte do meu código:
Este é o relacionamento entre as entidades que me interessa fazer o insert em cascata.
Classe Porte:
@OneToMany(mappedBy = "porte", cascade = CascadeType.ALL)
private List<PorteValores> porteValoresList;
@ManyToOne(optional = false)
@JoinColumn(name = "nr_grpporte", referencedColumnName = "nr_grupoporte", insertable = false, updatable = false)
private PorteGrupo nrGrpporte;
@ManyToOne(optional = false)
@JoinColumn(name = "nr_subgrpporte", referencedColumnName = "nr_subgrpporte", insertable = false, updatable = false)
private PorteSubgrupo nrSubgrpporte;
@OneToMany(mappedBy = "nrPorte", orphanRemoval = true, fetch = FetchType.LAZY)
private List<PorteAnestesico> porteAnestesicoList;
@OneToMany(mappedBy = "nrPorte", orphanRemoval = true, fetch = FetchType.LAZY)
private List<ProcedimentoValores> procedimentoValoresList;
Classe PorteValores:
@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "nr_porte", referencedColumnName = "nr_porte")
private Porte porte;
Estes são as outras entidades que fazer referencia de uso da classe porte, porém, serão somente leitura:
Classe PorteGrupo:
@OneToMany(mappedBy = "nrGrpporte", fetch = FetchType.LAZY)
private List<Porte> porteList;
Classe PorteSubgrupo:
@OneToMany(mappedBy = "nrSubgrpporte", fetch = FetchType.LAZY)
private List<Porte> porteList;
Classe PorteAnestesico:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "nr_porte", referencedColumnName = "nr_porte", insertable = false, updatable = false)
private Porte nrPorte;
Classe ProcedimentoValores:
@ManyToOne(optional = false)
@JoinColumn(name = "nr_porte", referencedColumnName = "nr_porte", insertable = false, updatable = false)
private Porte nrPorte;
Desde já agradeço a ajuda de todos