EJB3 + JBoss + PostgreSQL - A chave primária não é retornada ao persistir objeto

Olá, pessoal!

Estou aprendendo EJB3 e criei um exemplo bem simples pra rodar no JBoss.

Descrição:

Criei uma class Pessoa e uma class Carro. O banco de dados é gerado automaticamente pelo Hibernate.

O EJB está funcionando pois consigo pesquisar registros q já estão no banco. Mas qndo tento inserir uma Pessoa nova, por exemplo, eu não consigo pegar a Primary Key do novo registro. O q torna impossível inserir carros para as pessoas.

Pessoa.java

package tenorio.rodrigo.exemplos.bancodedados;

import java.io.Serializable;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;


@Entity
public class Pessoa implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String nome;
    private String cpf;

    @OneToMany(mappedBy = "proprietarioId", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    private Set<Carro> carro = new HashSet<Carro>();

    public Pessoa() {
    }

    public long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

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

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public void setCarro(Set<Carro> choices) {
        this.carro = choices;
    }

    public Set<Carro> getCarro() {
        return carro;
    }
}

Carro.java

package tenorio.rodrigo.exemplos.bancodedados;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
public class Carro implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String placa;

    @Column (name="proprietario_id")
    private int proprietarioId; // pessoa_id

    public Carro() {
    }

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

    public long getId() {
        return id;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public String getPlaca() {
        return placa;
    }

    public void setProprietarioId(int proprietarioId) {
        this.proprietarioId = proprietarioId;
    }

    public int getProprietarioId() {
        return proprietarioId;
    }
}

persistence.xml

<persistence>
  <persistence-unit name="bancoDeDados">
    <jta-data-source>java:/PostgresDS</jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
  </persistence-unit>
</persistence>

DAODBRemote.java

package tenorio.rodrigo.exemplos.bancodedados;

import javax.ejb.Remote;

import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;

@Remote
public interface DAODBRemote {

    public Pessoa findPessoa(int id);

    public void createPessoa(Pessoa pessoa);
}

DAODBBean.java

package tenorio.rodrigo.exemplos.bancodedados;

import javax.ejb.Stateful;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Stateful
public class DAODBBean implements DAODBRemote {

    @PersistenceContext(unitName = "bancoDeDados")
    private EntityManager manager;

    public Pessoa findPessoa(int id) {
        return this.manager.find(Pessoa.class, id);
    }

    public void createPessoa(Pessoa pessoa) {
        this.manager.persist(pessoa);
    }
}

Client.java

package tenorio.rodrigo.exemplos.bancodedados.client;

import java.util.Properties;

import javax.naming.InitialContext;

import tenorio.rodrigo.exemplos.bancodedados.DAODBRemote;
import tenorio.rodrigo.exemplos.bancodedados.Pessoa;


public class Client {

    public Client() {
        try {
            Properties properties = new Properties();
            properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
            properties.put("java.naming.factory.url.pkgs", "=org.jboss.naming:org.jnp.interfaces");
            properties.put("java.naming.provider.url", "localhost:1099");
            InitialContext ctx = new InitialContext(properties);
            DAODBRemote daoDBRemote = (DAODBRemote)ctx.lookup("DAODBBean/remote");

            Pessoa pessoa = new Pessoa();
            pessoa.setCpf("000.000.000-01");
            pessoa.setNome("Nome 01");

            daoDBRemote.createPessoa(pessoa);
            System.out.println("daoDBRemote.createPessoa(pessoa) == " + pessoa.getId());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Client();
    }
}

Valeu galera!!! Fico aguardando uma luz :slight_smile: