Relacionamento onetomany com JPA

E ai galera blz?
estou criando um relacionamento onetomany

//tabela produto_categoria
@OneToMany(mappedBy="categoria")
private List produtoTipos = new ArrayList();

//tabela produto_tipo
@ManyToOne
@JoinColumn(name="categoria_id")
private ProdutoCategoria produtoCategoria;

qual notação eu uso pra deixar o campo categoria_id como Not Null na tabela produto_tipo?

obs: ja usei @NotNull em ambas nao deu certo

Ola pauloarlobo,

Faz assim :

@ManyToOne  
@JoinColumn(name="categoria_id", nullable=false)  
private ProdutoCategoria produtoCategoria;  

Abraçoss !

valeu, deu certissimo

cara acontece uma coisa que eu to sem saber o pq, ele da esse erro quando eu entro na pagina, mas cria normal as tabelas e os relacionamentos

INFO: table not found: produto_tipo 09/09/2011 15:07:31 org.hibernate.tool.hbm2ddl.SchemaUpdate execute GRAVE: Unsuccessful: alter table produto_tipo add constraint FKB73AB0BA32A4B9F foreign key (categoria) references produto_categoria 09/09/2011 15:07:31 org.hibernate.tool.hbm2ddl.SchemaUpdate execute GRAVE: ERRO: restrição de chave estrangeira "fkb73ab0ba32a4b9f" não pode ser implementada Detalhe: Colunas chave "categoria" e "id" são de tipos incompatíveis: character varying e integer. 09/09/2011 15:07:31 org.hibernate.tool.hbm2ddl.SchemaUpdate execute

e outra coisa, tem como eu mudar o nome da chave estrangeira de “fkb73ab0ba32a4b9f” para “produto_categoria_id_fkey”?

Uhmm,

Se vc estiver usando o Hibernate existe a Anotação abaixo q pode ser usada para renomear as constraints.
O problema é q vc perde a abstração que o JPA te proporciona e passa a ter uma dependendia do HIBERNATE !

@ManyToOne  
@JoinColumn(name="categoria_id")  
@ForeignKey(name="fk_produto_categoria") 
private ProdutoCategoria produtoCategoria; 

Vc pode fazer isso gerar o banco e depois remove-la ( hehehe… )

Sobre o erro q esta acontecendo,

Verifique essa a classe que gera a tabela “produto_tipo”, parece q ela nã esta sendo gerada :

Se liga na mensagem de erro:

INFO: table not found: produto_tipo  

Verifique se a classe esta anotada com :

@Entity

e se ela esta no Hibernate.cfg.xml

Abraçoo !

Essa dependencia seria pouca, mas sua opniao usaria Hibernate pra isso ou mudava direto no banco? se for muitas tabelas ai num vira.

A respeito do erro, o que mais me intriga é que ele gera a tabela normal, olha a classe dela

package entidade;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.ForeignKey;

@Entity
@Table(name="produto_tipo")
public class ProdutoTipo {
	@Id
	@GeneratedValue
	private int id;
	
	@Column(length=20)
	private String categoria;

	@Column(length=50)
	private String descricao;
	
	@ManyToOne
	@JoinColumn(name="categoria_id",nullable=false)
	@ForeignKey(name="produto_categoria_id_fkey")
	private ProdutoCategoria produtoCategoria;
	
	//gets e sets
	public ProdutoCategoria getProdutoCategoria() {
		return produtoCategoria;
	}

	public void setProdutoCategoria(ProdutoCategoria produtoCategoria) {
		this.produtoCategoria = produtoCategoria;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}		
}

uma pergunta bem amadora, onde que fica esse xml Hibernate.cfg.xml

Posta ae a sua classe ProdutoCategoria.

Na verdade se vc estiver usando JPA ( puro ), não existe o arquivo hibernate.cfg.xml e sim o persistence.xml

São equivalentes

=D

A classe produto_categoria

package entidade;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="produto_categoria")
public class ProdutoCategoria {
	
	@Id
	@GeneratedValue
	private int id;
	
	@Column(length=50)
	private String descricao;
	
	@Lob
	private byte [] foto;

	@OneToMany(mappedBy="categoria")
	private List<ProdutoTipo> produtoTipos = new ArrayList<ProdutoTipo>();
	
	//gets e sets*/
	public byte[] getFoto() {
		return foto;
	}

	public List<ProdutoTipo> getProdutoTipos() {
		return produtoTipos;
	}

	public void setProdutoTipos(List<ProdutoTipo> produtoTipos) {
		this.produtoTipos = produtoTipos;
	}

	public void setFoto(byte[] foto) {
		this.foto = foto;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}

uhmmm,

Se liga no mapeamento q vc fez no atributo “produtosTipos” :

@OneToMany(mappedBy="categoria")  
private List<ProdutoTipo> produtoTipos = new ArrayList<ProdutoTipo>();  

Esta errado, o valor do mappedBy deve ser o nome do atributo que vc fez o mapeamento na classe ProdutoTipo.

O correto seria :

@OneToMany(mappedBy="produtoCategoria")  
private List<ProdutoTipo> produtoTipos = new ArrayList<ProdutoTipo>();  

Funcionou ae ?

continuo dando esse probelma, mas crio as tabelas normal, ta certo?

09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: fetching database metadata 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: updating schema 09/09/2011 16:22:04 org.hibernate.cfg.AnnotationConfiguration secondPassCompile INFO: Hibernate Validator not found: ignoring 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: Produto 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: produto_categoria 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: produto_tipo 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: Produto 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: produto_categoria 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: table not found: produto_tipo 09/09/2011 16:22:04 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: schema update complete

Num sei onde tava com a cabeca onde li um INFO como ERRO, ta blz.