Olá pessoal tudo blz?!?!
Seguinte estou usando o hibernate com annotations na camada de persistência. E quando gravo uma entidade que não tem FK de nenhuma outra entidade, funciona que é uma beleza. Porém, quando há FK´s envolvidas no lance e após a primeira inserção(a primeira funfa!) da problema… Estou desconfiado que seja a forma como fiz as annotations…
Segue a pilha de erros:
...
08:46:38,270 DEBUG JDBCExceptionReporter:69 - could not insert: [br.com.natcomp.meuagente.model.Topico] [/* insert br.com.natcomp.meuagente.model.Topico */ insert into topicos (topico_tipo, topico_titulo, topico_mensagem, confraria_id, usuario_id, topico_criacao) values (?, ?, ?, ?, ?, ?)]
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`meuagentebd/topicos`, CONSTRAINT `FKBC184B53B69B98F2` FOREIGN KEY (`topico_id`) REFERENCES `confrarias` (`confraria_id`))
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1160)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:685)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1400)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1314)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1299)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2154)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2634)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at br.com.natcomp.meuagente.bd.dao.hibernate.HibGenericDAO.salvar(HibGenericDAO.java:54)
at br.com.natcomp.meuagente.control.ConfrariaController.criarTopico(ConfrariaController.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:108)
at org.mentawai.filter.InjectionFilter.filter(InjectionFilter.java:128)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
at org.mentawai.filter.TransactionFilter.filter(TransactionFilter.java:127)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
at org.mentawai.filter.DIFilter.filter(DIFilter.java:171)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
at org.mentawai.filter.HibernateFilter.filter(HibernateFilter.java:186)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
at org.mentawai.filter.IoCFilter.filter(IoCFilter.java:82)
at org.mentawai.core.InvocationChain.invoke(InvocationChain.java:91)
at org.mentawai.core.Controller.invokeAction(Controller.java:635)
at org.mentawai.core.Controller.service(Controller.java:496)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
08:46:38,270 DEBUG AbstractSaveEventListener:153 - saving [br.com.natcomp.meuagente.model.Topico#<null>]
08:46:38,270 WARN JDBCExceptionReporter:77 - SQL Error: 1452, SQLState: 23000
...
As classes envolvidas no processo são estas: (estou omitindo os métodos setters, ok?!)
@Entity
@Table(name = "confrarias")
public class Confraria {
private Long id;
private String nome;
private Date dataCriacao = new Date();
private Tema tema;
private List<Usuario> associados = new ArrayList<Usuario>();
private List<Topico> informacoes = new ArrayList<Topico>();
private List<Topico> discussoes = new ArrayList<Topico>();
Confraria() {
}
public Confraria(String nome, Tema tema) {
super();
this.nome = nome;
this.tema = tema;
}
@Id
@GeneratedValue
@Column(name = "confraria_id")
public Long getId() {
return id;
}
@Column(name = "confraria_nome", nullable = false)
public String getNome() {
return nome;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "associados", joinColumns = @JoinColumn(name = "confraria_id"), inverseJoinColumns = @JoinColumn(name = "usuario_id"))
@org.hibernate.annotations.ForeignKey(name = "confraria_id", inverseName = "usuario_id")
public List<Usuario> getAssociados() {
return associados;
}
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")
@org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@org.hibernate.annotations.Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)
public List<Topico> getDiscussoes() {
return discussoes;
}
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id")
@org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@org.hibernate.annotations.Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)
public List<Topico> getInformacoes() {
return informacoes;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "confraria_criacao", nullable = false, updatable = false)
public Date getDataCriacao() {
return dataCriacao;
}
@Enumerated(EnumType.STRING)
@Column(name = "confraria_tema", length = 10, nullable = false)
public Tema getTema() {
return tema;
}
}
E
public class Usuario {
private Long id;
private String nome;
private String email;
private String senha;
private Date dataDeCadastro = new Date();
private List<Topico> topicosCriados = new ArrayList<Topico>();
private List<Confraria> confrariasQueParticipa = new ArrayList<Confraria>();
Usuario() {
}
public Usuario(String nome, String email, String senha) {
super();
this.nome = nome;
this.email = email;
this.senha = senha;
}
@Id
@GeneratedValue
@Column(name = "usuario_id")
public Long getId() {
return id;
}
@Column(name = "usuario_nome")
public String getNome() {
return nome;
}
@Column(name = "usuario_email")
public String getEmail() {
return email;
}
@Column(name = "usuario_senha")
public String getSenha() {
return senha;
}
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "usuario_id", nullable = true)
@org.hibernate.annotations.ForeignKey(name = "usuario_id")
public List<Topico> getTopicosCriados() {
return topicosCriados;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "usuario_cadastro", nullable = false, updatable = false)
public Date getDataDeCadastro() {
return dataDeCadastro;
}
@ManyToMany
@JoinTable(name = "associados", joinColumns = @JoinColumn(name = "usuario_id"), inverseJoinColumns = @JoinColumn(name = "confraria_id"))
@org.hibernate.annotations.ForeignKey(name = "usuario_id", inverseName = "confraria_id")
public List<Confraria> getConfrariasQueParticipa() {
return confrariasQueParticipa;
}
}
E a classe que, quando faço a persistência, da páu:
@Entity
@Table(name = "topicos")
public class Topico {
private Long id;
private String titulo;
private String mensagem;
private Date dataDeCriacao = new Date();
private TipoTopico tipoDoTopico;
private Usuario usuario;
private Confraria confraria;
Topico() {
}
/**
*
* @param titulo
* @param mensagem
* @param tipoDoTopico
* @param usuario
* @param confraria
*/
public Topico(String titulo, String mensagem, TipoTopico tipoDoTopico,
Usuario usuario, Confraria confraria) {
super();
this.titulo = titulo;
this.mensagem = mensagem;
this.tipoDoTopico = tipoDoTopico;
this.usuario = usuario;
this.confraria = confraria;
}
@Id
@GeneratedValue
@Column(name = "topico_id")
public Long getId() {
return id;
}
@Enumerated(EnumType.STRING)
@Column(name = "topico_tipo", length = 10, nullable = false)
public TipoTopico getTipo() {
return tipoDoTopico;
}
@Column(name = "topico_titulo", nullable = false)
public String getTitulo() {
return titulo;
}
@Column(name = "topico_mensagem", nullable = false)
public String getMensagem() {
return mensagem;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "confraria_id", nullable = false)
@org.hibernate.annotations.ForeignKey(name = "confraria_id")
public Confraria getConfraria() {
return confraria;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "usuario_id", nullable = false)
@org.hibernate.annotations.ForeignKey(name = "usuario_id")
public Usuario getUsuario() {
return usuario;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "topico_criacao", nullable = false, updatable = false)
public Date getDataDeCriacao() {
return dataDeCriacao;
}
}
Por favor, HELP!!!
Abraços…