Mapeamento

1 resposta
L

Olá.

Estou com uma duvida sobre como mapear umas classes.

Para explicar melhor, fiz um exemplo com uma classe Pessoa que possui um e um só objecto do tipo Carro.

Classe Pessoa
public class Pessoa {
	
	private int id;
	private String nome;
	private Carro carro;

	
	public Pessoa() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Carro getCarro() {
		return carro;
	}

	public void setCarro(Carro carro) {
		this.carro = carro;
	}

	public int getId() {
		return id;
	}

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

	public String getNome() {
		return nomePai;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}
Classe Carro
public class Carro {

	private int id;
	private String modelo;
	
	public Carro() {
		super();
		// TODO Auto-generated constructor stub
	}

	public int getId() {
		return id;
	}

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

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
}

Eu estou a mapear a relação desta forma:

Pessoa.hbm.xml
<hibernate-mapping>
	<class name="com.testecenter.model.Pessoa" table="Pessoa">

		<id name="id" type="integer">
			<generator class="assigned"/>
		</id>
	
		<property name="nome" />
	
		<many-to-one name="carro" column="carro_id"
			class="com.testecenter.model.Carro" lazy="false"/>
	</class>
</hibernate-mapping>
Carro.hbm.xml
<hibernate-mapping>
	<class name="com.testecenter.model.Carro" table="Carro">
		
		<id name="id" column="id">
			<generator class="assigned"/>
		</id>
		
		<property name="modelo" />
	
	</class>
</hibernate-mapping>

Assim, fico com uma coluna carro_id, na tabela Pessoa, que vai ter a chave apontar para a tabela Carro.

O problema é que consigo fazer pesquisas mas não consigo inserir.....
Eu acho que o problema está ao gerar as PK porque a PK do Carro tem de entrar na tabela Pessoa na coluna carro_id.

Alguem me pode dar uma ajuda ?[/b]

1 Resposta

C

l1nk,

Seguinte… Está correto o seu mapeamento e por garantia fiz um teste aqui com exatamente o mesmo código que vc postou aqui e funcionou perfeitamente.

Sendo assim, é provável que as tabelas na sua base não estão de acordo com o mapeamento.

Usei aqui o PostgreSQL para testar e usei o SchemaExport do Hibernate-Tools para gerar as tabelas na base de acordo com os mapeamentos.

public class ExportSchema {
    public static void main(String[] args) {
        try {
                    Configuration cfg = new Configuration()
                    .configure("/hibernate.cfg.xml");
                    SchemaExport schemaexport = new SchemaExport(cfg);
                    schemaexport.create(false,true);
        } catch (HibernateException hbe) {
            hbe.printStackTrace();
        }
    }
}

As tabelas geradas foram:

CREATE TABLE pessoa
(
  id integer NOT NULL,
  nome character varying(255),
  carro_id integer,
  CONSTRAINT pessoa_pkey PRIMARY KEY (id),
  CONSTRAINT fk8e48fbc7e92db1b0 FOREIGN KEY (carro_id)
      REFERENCES carro (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE carro
(
  id integer NOT NULL,
  modelo character varying(255),
  CONSTRAINT carro_pkey PRIMARY KEY (id)
);

Observação:

Quando fores inserir um objeto da classe Pessoa vc DEVE atribuir o ID para pessoa pois no mapeamento vc especificou “assigned” e ao associar um objeto da classe Carro vc também DEVE atribuir o ID para carro pelo mesmo motivo. E antes de salvar o objeto pessoa vc DEVE salvar antes o objeto carro para em seguida salvar pessoa, pois pessoa irá utilizar a chave primária de carro para ser armazenada e se ela não existir vc receberá uma exceção sobre violação de chave, como mostrado abaixo:

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Criado 25 de outubro de 2007
Ultima resposta 29 de out. de 2007
Respostas 1
Participantes 2