[HIBERNATE] - Chave composta com campo auto-incrementado

0 respostas
J

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;
		}

}
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;
		}

}

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?

Criado 20 de maio de 2010
Respostas 0
Participantes 1