Pessoal,
Estou tentando fazer uma chave composta com um campo de auto-incremento.
Tenho 2 entidades: Usuario e Casa. O relacionamento é 1-N identificador.
O Usuário tem chave composta, sendo composta por 2 campos: id e nome. O campo id, no banco, está sendo auto-incrementado, e o campo nome é um campo sem auto-incremento.
Segue a exemplificação:
CREATE TABLE usuario
(
id serial NOT NULL,
nome character varying(30) NOT NULL,
ativo character(1) NOT NULL DEFAULT 1,
CONSTRAINT pk_usuario PRIMARY KEY (id)
)
CREATE TABLE casa
(
usuario_id integer NOT NULL,
nome character varying(20),
CONSTRAINT pk_casa PRIMARY KEY (usuario_id),
CONSTRAINT fk_casa_usuario FOREIGN KEY (usuario_id)
REFERENCES usuario (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
Fiz a chave composta, de Usuario, numa classe UsuarioCompositePK. Como segue:
package fastcode.generatedApplication;
import fastcode.generatedApplication.UsuarioCompositePK;
import java.util.Collection;
import fastcode.generatedApplication.Casa;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.EmbeddedId;
import javax.persistence.Column;
import javax.persistence.OneToMany;
import javax.persistence.FetchType;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name="usuario")
public class Usuario{
@EmbeddedId()
private UsuarioCompositePK usuarioCompositePK;
@Column(name="ativo")
private char ativo = ' ';
@OneToMany(mappedBy="casaCompositePK.usuario",fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Casa> casaCollection;
public Usuario(){
}
public void setUsuariocompositepk(UsuarioCompositePK usuarioCompositePK){
this.usuarioCompositePK = usuarioCompositePK;
}
public UsuarioCompositePK getUsuariocompositepk(){
return this.usuarioCompositePK;
}
public void setAtivo(char ativo){
this.ativo = ativo;
}
public char getAtivo(){
return this.ativo;
}
public void setCasacollection(Collection<Casa> casaCollection){
this.casaCollection = casaCollection;
}
public Collection<Casa> getCasacollection(){
return this.casaCollection;
}
}
[code]
package fastcode.generatedApplication;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable()
public class UsuarioCompositePK implements Serializable{
private static final long serialVersionUID = 1L;
@Column(name="id")
private int id;
@Column(name="nome",length=30)
private String nome;
public void setId(int id){
this.id = id;
}
public int getId(){
return this.id;
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return this.nome;
}
}[/code]
Só que toda vez que mando salvar com o hibernate, através do Session.save(), ele dá o seguinte erro:
Batch entry 0 insert into public.usuario (ativo, id, nome) values (’ ', ‘0’, ‘Guilherme 0’) was aborted.
Quando verifiquei o erro no banco, é porque ele tenta inserir o id, com o valor ‘0’. Sendo que no banco, está como auto-incremento. Como faço para na chave composta ele não setar o valor do id, e reconhecer como auto-incremento?