Top Link problemas em inserir dados em 2 tabelas simultenamente

Estou com o seguinte problema

eu tenho uma tabela pessoa com um id que ele é serial, e tenho uma tabela aluno, que tem o id da tabela pessoa com chave estrangeira, sé que ao fazer a inserção dos dados na tabela pessoa, não estou conseguindo atribuir esse id gerado na tabela aluno

parte da classe pesso

public class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @GeneratedValue(generator = "pessao_id_seq", strategy = GenerationType.SEQUENCE)
    @Column(name = "id", nullable = false)
    private Integer id;
    @Column(name = "nome", length = 100)
    private String nome;

parte da classe aluno

public class Aluno implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "matricula", length = 12)
    private String matricula;
    @Id
    @Basic(optional = false)
    @GeneratedValue(generator="pessoa_id_seq",strategy=GenerationType.AUTO)
    @Column(name = "pessoaid", nullable = false)
    private Integer pessoaid;

setando as classes de entidade para ser inseridas ao banco

aluno.setMatricula(this.matricula.getValue().toString());
                pessoa.setNome(super.nome.getValue().toString());               
                pessoa.setSenha(super.senha.getValue().toString());
                aluno.setPessoaid(pessoa.getId());
                pessoa.setAluno(aluno);
                pessoa.salvar(pessoa);

como que eu posso resolver esse problema :?

[quote=joede.fadel]Estou com o seguinte problema

eu tenho uma tabela pessoa com um id que ele é serial, e tenho uma tabela aluno, que tem o id da tabela pessoa com chave estrangeira, sé que ao fazer a inserção dos dados na tabela pessoa, não estou conseguindo atribuir esse id gerado na tabela aluno

parte da classe pesso

public class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @GeneratedValue(generator = "pessao_id_seq", strategy = GenerationType.SEQUENCE)
    @Column(name = "id", nullable = false)
    private Integer id;
    @Column(name = "nome", length = 100)
    private String nome;

parte da classe aluno

public class Aluno implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "matricula", length = 12)
    private String matricula;
    @Id
    @Basic(optional = false)
    @GeneratedValue(generator="pessoa_id_seq",strategy=GenerationType.AUTO)
    @Column(name = "pessoaid", nullable = false)
    private Integer pessoaid;

setando as classes de entidade para ser inseridas ao banco

aluno.setMatricula(this.matricula.getValue().toString());
                pessoa.setNome(super.nome.getValue().toString());               
                pessoa.setSenha(super.senha.getValue().toString());
                aluno.setPessoaid(pessoa.getId());
                pessoa.setAluno(aluno);
                pessoa.salvar(pessoa);

como que eu posso resolver esse problema :?
[/quote]

vc deve colocar o relacionamento entre pessoa e aluno para que o ID de pessoa seja enxergado em aluno…

se quiser salvar uma pessoa, e ao mesmo tempo ele salve o aluno, deve fazer CASCADE.PERSIST no relacionamento

eu ja fiz isso e deu errado, continua dando erro
relacionamento da classe pessoa

@OneToOne(cascade = CascadeType.PERSIST, mappedBy = "pessoa")
    private Aluno aluno;

ou o erro é na classe Aluno

 @Id
    @GeneratedValue(generator = "pessoa_id_seq", strategy = GenerationType.AUTO)
    @Column(name = "pessoaid", nullable = false)
    private Integer pessoaid;

Esse é o erro que está dando, ele ta gerando id errado esse 602 é bem maior que o numero que está na sequencia

Internal Exception: org.postgresql.util.PSQLException: ERRO: inserção ou atualização em tabela "aluno" viola restrição de chave estrangeira "fk_aluno_7618" Detalhe: Chave (pessoaid)=(602) não está presente na tabela "pessoa". Error Code: 0 Call: INSERT INTO sispog.public.aluno (pessoaid, matricula, professorpessoaid) VALUES (?, ?, ?) bind => [602, 42342, null] Query: InsertObjectQuery(br.com.sisPog.Dao.Aluno[pessoaid=602]) 14/10/2009 16:06:50 br.com.sisPog.Dao.server salvar SEVERE: exception caught javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERRO: inserção ou atualização em tabela "aluno" viola restrição de chave estrangeira "fk_aluno_7618" Detalhe: Chave (pessoaid)=(602) não está presente na tabela "pessoa". Error Code: 0 Call: INSERT INTO sispog.public.aluno (pessoaid, matricula, professorpessoaid) VALUES (?, ?, ?) bind => [602, 42342, null] Query: InsertObjectQuery(br.com.sisPog.Dao.Aluno[pessoaid=602]) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60) at br.com.sisPog.Dao.server.salvar(server.java:43) at br.com.sisPog.Dao.Pessoa.teste(Pessoa.java:315) at br.com.sisPog.Dao.Pessoa.main(Pessoa.java:320) Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERRO: inserção ou atualização em tabela "aluno" viola restrição de chave estrangeira "fk_aluno_7618" Detalhe: Chave (pessoaid)=(602) não está presente na tabela "pessoa". Error Code: 0 Call: INSERT INTO sispog.public.aluno (pessoaid, matricula, professorpessoaid) VALUES (?, ?, ?) bind => [602, 42342, null] Query: InsertObjectQuery(br.com.sisPog.Dao.Aluno[pessoaid=602]) at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:311) at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:654) at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:703) at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:492) at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452) at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:690) at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214) at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:346) at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:191) at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:205) at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:564) at oracle.toplink.essentials.queryframework.InsertObjectQuery.executeCommit(InsertObjectQuery.java:89) at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:750) at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:714) at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:602) at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:162) at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:390) at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:109) at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628) at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:555) at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:138) at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:110) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2233) at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952) at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:909) at oracle.toplink.essentials.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:269) at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:246) at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:202) at oracle.toplink.essentials.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2657) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1044) at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:403) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1126) at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:107) at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:856) at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:102) ... 4 more Caused by: org.postgresql.util.PSQLException: ERRO: inserção ou atualização em tabela "aluno" viola restrição de chave estrangeira "fk_aluno_7618" Detalhe: Chave (pessoaid)=(602) não está presente na tabela "pessoa". at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304) at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:647) ... 38 more Exception in thread "main" java.lang.IllegalStateException: Exception Description: No transaction is currently active at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.rollback(EntityTransactionImpl.java:140) at br.com.sisPog.Dao.server.salvar(server.java:46) at br.com.sisPog.Dao.Pessoa.teste(Pessoa.java:315) at br.com.sisPog.Dao.Pessoa.main(Pessoa.java:320)

 @Id
    @GeneratedValue(generator = "pessoa_id_seq", strategy = GenerationType.AUTO)
    @Column(name = "pessoaid", nullable = false)
    private Integer pessoaid;

esse mapeamento não esta bom… como falei vc precisa pegar o ID de pessoaId, e não da sequencia, Aluno não tem geração de ID, o ID dela é um FK, e portanto não deve ser gerado pelo banco, e sim setado…

mude assim:

    @Id
    @OneToOne
    @JoinColum(name = "pessoaid", nullable = false)
    private Pessoa pessoa;

assim que vc deveria mapear… ai quando o valor em Pessoa for persistido o id aprece, e aluno tb consegue ser persistido…

como vc fez anteriormente, ele gerava o número de ID de pessoa, através do sequenciador, depois fazia o mesmo para o aluno resultando em 2 números diferentes