Hibernate e constraints

2 respostas
rafael.espiritosanto

Olá!

Ao utilizar o Hibernate, configurei o persistence.xml para criar as tabelas automaticamente.
Precisei fazer uma engenharia reversa do banco para exibir o modelo relacional.
O que eu fiz foi executar um backup do banco (mysql) e então fiz a engenharia reversa através do MySQL Workbench.
O que eu reparei é que não foram definidas as constraints entre as diversas tabelas.
Não sei defini a anotação de relacionamento entre as entidades corretamente.

package br.ufrj.cos.bri.model;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

@Entity
public class Documento implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private long id;
	private String numeroPaper;
	private String numeroRegistro;
	private String numeroMedline;
	private String titulo;
	private String fonte;
	private String textoAbstract;
	private Map<String, Author> autores; 
	private List<MajorSubtopic> majorSubtopic;
	private List<MinorSubtopic> minorSubtopic;
	private List<Referencia> references;
	private List<Citations> citations;
	private String textoCompleto;
	private String tituloAbstract;
	
	@Id @GeneratedValue
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNumeroPaper() {
		return numeroPaper;
	}
	public void setNumeroPaper(String numeroPaper) {
		this.numeroPaper = numeroPaper;
	}
	public String getNumeroRegistro() {
		return numeroRegistro;
	}
	public void setNumeroRegistro(String numeroRegistro) {
		this.numeroRegistro = numeroRegistro;
	}
	public String getNumeroMedline() {
		return numeroMedline;
	}
	public void setNumeroMedline(String numeroMedline) {
		this.numeroMedline = numeroMedline;
	}
	@Lob
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getFonte() {
		return fonte;
	}
	public void setFonte(String fonte) {
		this.fonte = fonte;
	}
	@Lob
	public String getTextoAbstract() {
		return textoAbstract;
	}
	public void setTextoAbstract(String textoAbstract) {
		this.textoAbstract = textoAbstract;
	}
	
	@ManyToMany(cascade=CascadeType.ALL)
	public Map<String, Author> getAutores() {
		return autores;
	}
	public void setAutores(Map<String, Author> autores) {
		this.autores = autores;
	}
	@OneToMany(cascade=CascadeType.ALL)
	public List<MajorSubtopic> getMajorSubtopic() {
		return majorSubtopic;
	}
	public void setMajorSubtopic(List<MajorSubtopic> majorSubtopic) {
		this.majorSubtopic = majorSubtopic;
	}
	
	@OneToMany(cascade=CascadeType.ALL)
	public List<MinorSubtopic> getMinorSubtopic() {
		return minorSubtopic;
	}
	public void setMinorSubtopic(List<MinorSubtopic> minorSubtopic) {
		this.minorSubtopic = minorSubtopic;
	}
	
	@OneToMany(cascade=CascadeType.ALL)
	public List<Referencia> getReferences() {
		return references;
	}
	public void setReferences(List<Referencia> references) {
		this.references = references;
	}
	
	@OneToMany(cascade=CascadeType.ALL)
	public List<Citations> getCitations() {
		return citations;
	}
	public void setCitations(List<Citations> citations) {
		this.citations = citations;
	}
	@Lob
	public String getTextoCompleto() {
		return textoCompleto;
	}
	public void setTextoCompleto(String textoCompleto) {
		this.textoCompleto = textoCompleto;
	}
	@Lob
	public String getTituloAbstract() {
		return tituloAbstract;
	}
	public void setTituloAbstract(String tituloAbstract) {
		this.tituloAbstract = tituloAbstract;
	}
}

Por que o Hibernate não criou o relacionamento entre as tabelas (através das constraints) e como posso fazer isto?
Em anexo o diagrama resultante da engenharia reversa do banco.

abraços!

2 Respostas

Lavieri

Olhei seu modelo relacionou… os Index não estão abertos, e não há nenhum constraint aparecendo…

A eng reversa, pega Unique constraint, e faz as FK, porem ele não define bem os modos de cascata, isso vc deve conferir e colocar o que é melhor pra cada caso…

fora isso, outros constraint podem ser modelados através de @PrePersist, @PreRemove, @PreUpdate, @PostPersist, @PostRemove, @PostUpdate

onde vc pode fazer as checagem antes e depois de cada 1 das operações…

essa anotações podem ir dentro da classe nos métodos que checam as constraint, ou fora delas, em EntityListeners…

rafael.espiritosanto

As constraints foram definidas (pelo menos aparentemente).
O que eu fiquei na dúvida é pq o Workbench não preencheu o relacionamento entre as tabelas.

abraço!


Criado 4 de abril de 2009
Ultima resposta 5 de abr. de 2009
Respostas 2
Participantes 2