Mapeamento

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

[code]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;
}

}[/code]

Classe Carro

[code]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;
}

}[/code]

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

Pessoa.hbm.xml

[code]<hibernate-mapping>
<class name="com.testecenter.model.Pessoa" table="Pessoa">

	&lt;id name=&quot;id&quot; type=&quot;integer&quot;&gt;
		&lt;generator class=&quot;assigned&quot;/&gt;
	&lt;/id&gt;

	&lt;property name=&quot;nome&quot; /&gt;

	&lt;many-to-one name=&quot;carro&quot; column=&quot;carro_id&quot;
		class=&quot;com.testecenter.model.Carro&quot; lazy=&quot;false&quot;/&gt;
&lt;/class&gt;

</hibernate-mapping>[/code]

Carro.hbm.xml

[code]<hibernate-mapping>
<class name="com.testecenter.model.Carro" table="Carro">

	&lt;id name=&quot;id&quot; column=&quot;id&quot;&gt;
		&lt;generator class=&quot;assigned&quot;/&gt;
	&lt;/id&gt;
	
	&lt;property name=&quot;modelo&quot; /&gt;

&lt;/class&gt;

</hibernate-mapping>[/code]

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]

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 &#123;
    public static void main&#40;String&#91;&#93; args&#41; &#123;
        try &#123;
                    Configuration cfg = new Configuration&#40;&#41;
                    .configure&#40;&quot;/hibernate.cfg.xml&quot;&#41;;
                    SchemaExport schemaexport = new SchemaExport&#40;cfg&#41;;
                    schemaexport.create&#40;false,true&#41;;
        &#125; catch &#40;HibernateException hbe&#41; &#123;
            hbe.printStackTrace&#40;&#41;;
        &#125;
    &#125;
&#125;

As tabelas geradas foram:

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

CREATE TABLE carro
&#40;
  id integer NOT NULL,
  modelo character varying&#40;255&#41;,
  CONSTRAINT carro_pkey PRIMARY KEY &#40;id&#41;
&#41;;

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&#58; Could not execute JDBC batch update