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>();
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.