Hibernate + Annotations, depois do primeiro "insert" da problema... PQ?

0 respostas
cesarcneto

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…

Criado 28 de março de 2007
Respostas 0
Participantes 1