Pessoal, preciso de uma ajuda no hibernate.
Tenho uma tabela ‘evento’ (EVT_APL_BXCP_NOVO)
tenho outra tabela ‘atributos do evento’ (TIP_ATB)
e mais outra tabela ‘sonda do evento’ (SONDA).
E uma tabela com a fk de cada id das 3 tabelas acima (EVT_APL_BXCP_SONDA).
O problema:
Não sei se estou mapeando isso certo no hibernate, se é nas classes que não estou conseguindo!
Consigo gravar nas 3 tabelas acima. Porém quando tento gravar a quarta (EVT_APL_BXCP_SONDA), consigo inserir apenas 2 ids. aí dá excessão org.hibernate.exception.ConstraintViolationException.
As tabelas:
Evento:
id_evento (pk)
campo1
campo2
campo3
campo4
atributos_do_evento
id_atributo (pk)
campo1
campo2
campo3
campo4
sonda_do_evento
id_sonda (pk)
campo1
campo2
campo3
campo4
tabela conexao
id_evento (fk)
id_atributo (fk)
id_sonda (fk)
a classe eventos
private long idEvento;
private String siglaSistema;
private String tipoRecurso;
private String nomeHardware;
private Timestamp ocorrenciaEvento;
private int codigoCriticidade;
private String textoEventoAdicional;
private Timestamp recepcaoEvento;
private Timestamp encerramentoEvento;
private String codigoIdentificadorVersaoEvento = "CEV#V02";
public long getIdEvento() {
return idEvento;
}
public void setIdEvento(long idEvento) {
this.idEvento = idEvento;
}
public String getSiglaSistema() {
return siglaSistema;
}
public void setSiglaSistema(String siglaSistema) {
this.siglaSistema = siglaSistema;
}
public String getTipoRecurso() {
return tipoRecurso;
}
public void setTipoRecurso(String tipoRecurso) {
this.tipoRecurso = tipoRecurso;
}
public String getNomeHardware() {
return nomeHardware;
}
public void setNomeHardware(String nomeHardware) {
this.nomeHardware = nomeHardware;
}
public Timestamp getOcorrenciaEvento() {
return ocorrenciaEvento;
}
public void setOcorrenciaEvento(Timestamp ocorrenciaEvento) {
this.ocorrenciaEvento = ocorrenciaEvento;
}
public int getCodigoCriticidade() {
return codigoCriticidade;
}
public void setCodigoCriticidade(int codigoCriticidade) {
this.codigoCriticidade = codigoCriticidade;
}
public String getTextoEventoAdicional() {
return textoEventoAdicional;
}
public void setTextoEventoAdicional(String textoEventoAdicional) {
this.textoEventoAdicional = textoEventoAdicional;
}
public Timestamp getRecepcaoEvento() {
return recepcaoEvento;
}
public void setRecepcaoEvento(Timestamp recepcaoEvento) {
this.recepcaoEvento = recepcaoEvento;
}
public Timestamp getEncerramentoEvento() {
return encerramentoEvento;
}
public void setEncerramentoEvento(Timestamp encerramentoEvento) {
this.encerramentoEvento = encerramentoEvento;
}
public String getCodigoIdentificadorVersaoEvento() {
return codigoIdentificadorVersaoEvento;
}
public void setCodigoIdentificadorVersaoEvento(
String codigoIdentificadorVersaoEvento) {
this.codigoIdentificadorVersaoEvento = codigoIdentificadorVersaoEvento;
}
private Set atributos = new HashSet();
public Set getAtributos() {
return atributos;
}
public void setAtributos(Set atributos) {
this.atributos = atributos;
}
private Set transacao = new HashSet();
public Set getTransacao() {
return transacao;
}
public void setTransacao(Set transacao) {
this.transacao = transacao;
}
private Set sonda = new HashSet();
public Set getSonda() {
return sonda;
}
public void setSonda(Set sonda) {
this.sonda = sonda;
}
o arquivo eventos.hbm.xml
<hibernate-mapping package="sgs.to">
<class name="Eventos" table="EVT_APL_BXCP_NOVO">
<id name="idEvento" column="ID_EVT">
<generator class="native" />
</id>
<property name="siglaSistema" column="SG_SIS" />
<property name="tipoRecurso" column="CD_RCD_TECC" />
<property name="nomeHardware" column="NM_HW" />
<property name="ocorrenciaEvento" type="timestamp" column="TS_OCR_EVT" />
<property name="codigoCriticidade" column="CD_CRTC" />
<property name="textoEventoAdicional" column="TX_EVT_ADC" />
<property name="recepcaoEvento" type="timestamp" column="TS_RECP_EVT" />
<property name="encerramentoEvento" type="timestamp" column="TS_ECR_EVT" />
<property name="codigoIdentificadorVersaoEvento" column="CD_IDFR_VRS_EVT" />
<set name="atributos" table="EVT_APL_BXCP_ATB" inverse="true">
<key column="ID_EVT" />
<many-to-many column="ID_ATB" class="TipoAtributo" />
</set>
<set name="transacao" table="EVT_APL_BXCP_TRAN" inverse="true">
<key column="ID_EVT" />
<many-to-many column="ID_TRAN_MVL" class="TransacaoMobile" />
</set>
<set name="sonda" table="EVT_APL_BXCP_SONDA" inverse="true">
<key column="ID_EVT" />
<many-to-many column="ID_SONDA" class="SondaMobile" />
</set>
</class>
</hibernate-mapping>
a classe atributos do evento
public class TipoAtributo {
private long idAtributo;
private String descricao;
public long getIdAtributo() {
return idAtributo;
}
public void setIdAtributo(long idAtributo) {
this.idAtributo = idAtributo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
/* atributos do evento */
private Set eventos = new HashSet();
public Set getEventos() {
return eventos;
}
public void setEventos(Set eventos) {
this.eventos = eventos;
}
/* atributos da transação mobile */
private Set transacao = new HashSet();
public Set getTransacao() {
return transacao;
}
public void setTransacao(Set transacao) {
this.transacao = transacao;
}
/* atributos da sonda */
private Set sonda = new HashSet();
public Set getSonda() {
return sonda;
}
public void setSonda(Set sonda) {
this.sonda = sonda;
}
}
atributos.hbm.xml
<hibernate-mapping package="sgs.to">
<class name="TipoAtributo" table="TIP_ATB">
<id name="idAtributo" column="ID_ATB">
<generator class="native" />
</id>
<property name="descricao" column="DCR_ATB" />
<set name="eventos" table="EVT_APL_BXCP_ATB">
<key column="ID_ATB" />
<many-to-many column="ID_EVT" class="Eventos" />
</set>
<set name="transacao" table="EVT_APL_BXCP_TRAN">
<key column="ID_ATB" />
<many-to-many column="ID_TRAN_MVL" class="TransacaoMobile" />
</set>
<set name="sonda" table="EVT_APL_BXCP_SONDA">
<key column="ID_ATB" />
<many-to-many column="ID_SONDA" class="SondaMobile" />
</set>
</class>
</hibernate-mapping>
classe sonda
public class SondaMobile {
private long idSonda;
private String descricaoTecnologia;
private String descricaoOperadora;
private String ipOrigem;
public long getIdSonda() {
return idSonda;
}
public void setIdSonda(long idSonda) {
this.idSonda = idSonda;
}
public String getDescricaoTecnologia() {
return descricaoTecnologia;
}
public void setDescricaoTecnologia(String descricaoTecnologia) {
this.descricaoTecnologia = descricaoTecnologia;
}
public String getDescricaoOperadora() {
return descricaoOperadora;
}
public void setDescricaoOperadora(String descricaoOperadora) {
this.descricaoOperadora = descricaoOperadora;
}
public String getIpOrigem() {
return ipOrigem;
}
public void setIpOrigem(String ipOrigem) {
this.ipOrigem = ipOrigem;
}
/* sonda do evento */
private Set eventos = new HashSet();
public Set getEventos() {
return eventos;
}
public void setEventos(Set eventos) {
this.eventos = eventos;
}
/* sonda dos atributos */
private Set atributos = new HashSet();
public Set getAtributos() {
return atributos;
}
public void setAtributos(Set atributos) {
this.atributos = atributos;
}
}
sonda.hbm.xml
<hibernate-mapping package="sgs.to">
<class name="SondaMobile" table="SONDA">
<id name="idSonda" column="ID_SONDA">
<generator class="native" />
</id>
<property name="descricaoTecnologia" column="DCR_TECN" />
<property name="descricaoOperadora" column="DCR_OPRD" />
<property name="ipOrigem" column="IP_OGM" />
<set name="eventos" table="EVT_APL_BXCP_SONDA">
<key column="ID_SONDA" />
<many-to-many column="ID_EVT" class="Eventos" />
</set>
<set name="atributos" table="EVT_APL_BXCP_SONDA">
<key column="ID_SONDA" />
<many-to-many column="ID_ATB" class="TipoAtributo" />
</set>
</class>
</hibernate-mapping>
o arquivo hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
<property name="hibernate.connection.password">xxxxxx</property>
<property name="hibernate.connection.url">jdbc:db2://10.22.19.76:50000/D1SGS01</property>
<property name="hibernate.connection.username">xxx</property>
<property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
<!-- Habilita gerenciamento de contexto de sessões automático -->
<property name="current_session_context_class">thread</property>
<!-- Desabilita cache second-level -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<!-- pool de conexões -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">200</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hbm2ddl.auto">create</property>
<!-- mapeamento das tabelas no banco de dados -->
<mapping resource="sgs/to/Eventos.hbm.xml"/>
<mapping resource="sgs/to/TipoAtributo.hbm.xml"/>
<mapping resource="sgs/to/Sonda.hbm.xml"/>
<mapping resource="sgs/to/Transacao.hbm.xml"/>
</session-factory>
</hibernate-configuration>
E agora o erro, quando gravar a última tabela. Essa última tabela se chama (EVT_APL_BXCP_SONDA):
Hibernate: insert into EVT_APL_BXCP_SONDA (ID_SONDA, ID_EVT) values (?, ?)
17:46:11,169 WARN JDBCExceptionReporter:77 - SQL Error: -407, SQLState: 23502
17:46:11,169 ERROR JDBCExceptionReporter:78 - DB2 SQL error: SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=4, COLNO=2
17:46:11,201 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert collection rows: [sgs.to.SondaMobile.eventos#1]
Observe que na primeira linha o hibernate tenta inserir o id_sonda, id_evt - mas não tenta inserir o id_atb (id do atributo). Por isso dá erro!
Estou geranto as tabelas com o <property name="hbm2ddl.auto">create</property>
Meu problema é no mapeamento ou nas classes. Alguém pode me ajudar?