Duvida - ultimo registro mais um com Hibernate [RESOLVIDO]

Olá pessoal…

Já pesquisei bastante aqui no forum e no professor Google, mas não obtive resultado para meu problema.
Eu preciso fazer com que no ato de cadastrar um Dependente para uma determinada Pessoa, eu consiga inserir o codigo da Pessoa na minha tabela Dependente.
Ex. Vou cadastrar uma nova Pessoa e essa Pessoa possui Dependentes (que são populados na minha JTable) - Até ai tudo bem, ou seja, eu consigo inserir os Dependentes para cada determinada Pessoa. Mas o problema é que esses Dependentes estão sendo incluidos no BD com o codigo da Pessoa anterior.
Para esclarecer melhor tudo isso segue abaixo o que eu quero fazer:

Pessoa - João (codigo 1)
Dependentes - filhoJoao1, filhoJoao2, etc.
Pessoa - José (codigo 2)
Dependentes - filhoJose1, filhoJose2, etc.

Quando eu vou cadastrar o “José” no meu BD está sendo inserido da seguinte forma:

Pessoa - João (codigo 1)
Dependentes - filhoJoao1, filhoJoao2, filhoJose1, filhoJose2, etc.

Ou seja, os dependentes de José estão sendo cadastrados no João!

Segue abaixo meus códigos:

Método de retornar o ultimo em PessoasDAO

public Pessoas selecionarUltimo() throws Exception {
        Session session = null;
        try {
            Criteria criteria = HibernateUtil.getSession().createCriteria(Pessoas.class);
            criteria.addOrder(Order.desc("pes_Codigo"));
            return (Pessoas)criteria.list().get(0);
        } catch(Exception e){
            e.printStackTrace();
            throw e;            
        } finally {
            if(session != null && session.isOpen()){
            session.close();
            }
        }
    }

Método de cadastrar o Dependente (dentro do form de cadastro de Pessoas)

public void cadastrarDep() {
        try {            
            PessoasDAO pDao = new PessoasDAO();
            Pessoas ultimo = new Pessoas();
            ultimo = pDao.selecionarUltimo();
            ManipulaTime mt = new ManipulaTime();
            Dependentes d = new Dependentes();
            d.setNome(txtNomeDependente.getText());
            d.setDataNascimento(mt.convertStringToDate(txtDataNascDependente.getText()));
            if(btbAlterar.isSelected())
                d.setCodPessoa(pDao.carregarPorID(Integer.parseInt(txtCodigo.getText())));
            else
                d.setCodPessoa(ultimo);            
            ld.add(d);
            txtNomeDependente.setText("");
            txtDataNascDependente.setText("");
            carregaTable(ld);    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Eu já tentei fazer algo assim mas não deu certo:

d.setCodPessoa(ultimo+1);     // Pegar o ultimo codigo cadastrado no BD e somar mais um       

Se puderem me ajudar eu agradeço…
Sugestoes são sempre benvindas!
Abraço

Vamos por partes.
Primeiro, você consegue obter o código da Pessoa anterior?
Segundo, como está definida a forma de geração da chave primária na entidade? Você pode fazer com que o próprio hibernate a gerencie.

Olá drsmachado

Eu já consigo pegar o codigo anterior

Na minha classe Pessoa eu tenho um List de dependentes:

@OneToMany
@Cascade(CascadeType.ALL)
private List<Dependentes> dependente;

Na minha classe Dependente eu tenho isso:

@ManyToOne
private Pessoas codPessoa;

[quote=GuilhermeSilva]Olá drsmachado

Eu já consigo pegar o codigo anterior

Na minha classe Pessoa eu tenho um List de dependentes:

@OneToMany
@Cascade(CascadeType.ALL)
private List<Dependentes> dependente;

Na minha classe Dependente eu tenho isso:

@ManyToOne private Pessoas codPessoa; [/quote]
Mas… E o atributo que tem a anotação @Id, que foi o que eu perguntei?

Id de Dependentes:

@Id
@GeneratedValue
private Integer codigo;

Id de Pessoas:

@Id
@GeneratedValue
private Integer pes_Codigo;

Eu optaria por não colocar os ids de dependentes como generated, assim você consegue controlar os mesmos.

Certo, mas como eu controlaria melhor isso?
Por favor, me corrija se eu estiver errado, mas eu acho que o id de Dependente não tem muito a ver com o problema, mas sim o fato de eu ter que somar mais um para pegar esse codigo que será cadastrado, pois, na linha d.setCodPessoa(ultimo) quando eu faço ultimo+1 ele da erro, pois, eu deveria setar com um objeto e não com um inteiro.

Estou certo, errado ou no caminho???

[quote=GuilhermeSilva]Certo, mas como eu controlaria melhor isso?
Por favor, me corrija se eu estiver errado, mas eu acho que o id de Dependente não tem muito a ver com o problema, mas sim o fato de eu ter que somar mais um para pegar esse codigo que será cadastrado, pois, na linha d.setCodPessoa(ultimo) quando eu faço ultimo+1 ele da erro, pois, eu deveria setar com um objeto e não com um inteiro.

Estou certo, errado ou no caminho???
[/quote]
A classe Integer é um Wrapper. Quando eu faço

Integer i = 1;
A JVM automaticamente entende que eu “quis dizer”

Integer i = new Integer(1);

Manja?
Fazer isto

Integer ex = 1 + 3*4 / 12 - 5;

É válido também e vai gerar um integer cujo intValue = -3.

drsmachado num entendi muito bem o que vc propos…
Se puder esclarecer um pouco eu agradeço…

[quote=GuilhermeSilva]drsmachado num entendi muito bem o que vc propos…
Se puder esclarecer um pouco eu agradeço… [/quote]
Não propus nada.
Apenas disse que a classe Integer (e o atributo id é um objeto da classe Integer) não recrimina o uso de

d.setCodPessoa(ultimo+1);     // Pegar o ultimo codigo cadastrado no BD e somar mais um 

O que você eu creio que esteja atrapalhando é mesmo a anotação @GeneratedValue. Embora eu não tenha certeza, pode ser que esta anotação esteja sobrescrevendo o valor informado para estes registros. Entende?

Acho que estou assimilando as coisas.
Então se eu tirar o @GeneratedValue da minha classe Dependentes, eu conseguiria com os mesmos códigos acima persistir essa lista de Dependentes pegando o codigo da pessoa?

[quote=GuilhermeSilva]Acho que estou assimilando as coisas.
Então se eu tirar o @GeneratedValue da minha classe Dependentes, eu conseguiria com os mesmos códigos acima persistir essa lista de Dependentes pegando o codigo da pessoa?

[/quote]
Como eu te disse, não tenho certeza e, onde estou, não consigo simular.
Acontece que o hibernate pode estar sobrescrevendo a informação nos objetos que representam dependentes.
Portanto, testar seria o ideal, remover aquela anotação e tentar persistir, pra ver o que acontece.
No máximo, vai precisar colocá-la novamente e recomeçar a procura.

Fiz o teste sem o @GeneratedValue da classe Dependentes e o console me informou esse erro:

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): beans.Dependentes

Enfim… a procura pela solução continua…
Mas eu agradeço sua colaboração em me ajudar!

Alguém se habilita em me ajudar?
Preciso o quanto antes resolver esse problema

Desde já agradeço…

[quote=GuilhermeSilva]Fiz o teste sem o @GeneratedValue da classe Dependentes e o console me informou esse erro:

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): beans.Dependentes

Enfim… a procura pela solução continua…
Mas eu agradeço sua colaboração em me ajudar![/quote]
Se não manja de inglês, chegou a jogar no translate.google.com pra ver o que é?
A mensagem de erro diz que o atributo Id precisa ser definido manualmente para a classe beans.Dependentes, antes de chamar o método save().

Ou seja, você deve informar o Id deles, não era isso que estava querendo?

Certo…
Mas pensa cmg…
Eu terei que sempre que for inserir esses Dependentes na minha JTable informar o Id?
Eu terei de utilizar meu método selecionarUltimo para pegar o ultimo registro?

Se for dessa maneira eu ainda não vejo solução, pois, eu ainda não consegui fazer com que o ultimo seja somado mais um.
Desculpe as vezes a minha ignorancia… é que esse projeto é um desafio pra mim…
Se eu estiver errado, por favor me corrija!

Consegui resolver meu problema!

Eu criei o mesmo metodo de selecionarUltimo() de PessoasDAO no meu DependentesDAO, sendo assim, quando a nova Pessoa é cadastrada, eu faço um update em Dependentes selecionando o ultimo registro, dessa forma o codPessoa da minha classe Dependentes fica com o mesmo codigo da minha classe Pessoas.
Vale ressaltar que essa é a opção que atendeu minhas necessidades, portanto, segue os códigos abaixo para eventuais consultas e ajudas, assim como eu também fui ajudado aqui.

PessoasDAO pDao = new PessoasDAO();
                pDao.cadastrarPessoa(pes);
                
                JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso");
                Pessoas ultimo = new Pessoas();
                Dependentes dep = new Dependentes();
                DependentesDAO dDao = new DependentesDAO();
                ultimo = pDao.selecionarUltimo();
                dep = dDao.selecionarUltimo();
                try {
                    JTextField txtCodDep = new JTextField();
                    txtCodDep.setText(String.valueOf(ultimo.getPes_Codigo()));
                    dep.setCodPessoa(pDao.carregarPorID(Integer.parseInt(txtCodDep.getText())));
                    dDao.alterar(dep);
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Erro ao inserir Dependentes - "+e);
                }

Obrigado drsmachado pelas suas dicas!