JPA 1 + hibernate + @OneToMany + MySQL autoincrement

9 respostas
G

Bom pessoal,

Estou tentando fazer uma inclusão em cascata utilizando o relacionamento @OneToMany. O problema é que a tabela FILHA não consegue pegar o ID da tabela PAI.

Na minha classe modelo, os relacionamentos foram colocados da seguinte forma:

@Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "codSolicitacao", updatable = true, nullable = false, insertable = true)
  public int getCodSolicitacao()
  {
    return this.codSolicitacao;
  }

  public void setCodSolicitacao(int codSolicitacao)
  {
    this.codSolicitacao = codSolicitacao;
  }
.
.
.
.
  @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
  @JoinTable(name = "reserva", joinColumns = @JoinColumn(name = "codSolicitacao"), inverseJoinColumns = @JoinColumn(name = "codReserva"))
  public Collection<Reserva> getColReserva()
  {
     return colReserva;
  }
  
  public void setColReserva(Collection<Reserva> colReserva)
  {
     this.colReserva = colReserva;
  }

Já tentei diversas outras combinações, mas, sem sucesso.

Será que alguém poderia me ajudar a tentar resolver esse problema?

Desde já obrigado!

9 Respostas

Hebert_Coelho

Vc está utilizando JPA 1 com anotações? :shock:

Hebert_Coelho

Outra coisa:

Estou tentando fazer uma inclusão em cascata utilizando o relacionamento @OneToMany. O problema é que a tabela FILHA não consegue pegar o ID da tabela PAI.
Uma coisa é herança (pai e filha) outra coisa é relacionamento (OneToMany). Vc está confundindo diversos conceitos.

G

Certo,

Então vamos as perguntas. É possível? Porque consigo fazer atualização dessa forma.

Eu conseguiria cadastrar uma solicitação e suas reservas em uma única transação de forma que o id da solicitação fosse colocado automaticamente na chave estrangeira da tabela reserva?

Lembrando que sou leigo no assunto, estou tentando aprender agora toda essa coisa.

Como eu disse, consegui fazer atualizar os dados quando necessário dessa forma. Porque a inclusão não está sendo possível?

Até mais…

Hebert_Coelho

Vc está utilizando qual versão do JPA?

G

Não fui eu que configurei o ambiente então o que sei é que não posso usar a 2.

Mas, mesmo que seja possível de alguma forma talvez me ajude. O que eu poderia fazer para que meu atributo codSolicitacao que está na Collection reserva fosse preenchido automaticamente ao incluir uma solicitação?

A forma que estou tentando fazer:

Collection<Reserva> colReserva = new ArrayList<Reserva>();
.
.
.
Reserva novaReserva = new Reserva();
.
.
.
//Preencho os atributos
.
.
.
colReserva.add(novaReserva);
.
.
.
solicitacao.setColReserva(colReserva);

Mas, aproveitando, me tire uma dúvida quanto ao comentário do outro amigo nosso ai que comentou sobre as annotations. No JPA 1 não tem annotations?

Valeu demais pelas respostas…

--------------------------- EDITANDO ------------------------------
Pedi ao meu colega que implantou o ambiente ajuda sobre qual é a versão do JPA e ele disse:

JPA 1.0 faz parte da Java EE 5. Estamos limitados à essa plataforma.


Até mais…

Hebert_Coelho

Bem, JPA 1 eu não tenho como te dar suporte. Nem sabia que ele suportava anotações.

G

Beleza, mas como seria então em JPA 2?

O que eu tenho que fazer para que o meu código funcione com o MySQL autoincrement?

Me parece que esse blog (http://uaihebert.com) é seu.

Vi que tem uns exemplos lá mas que usam sequence. Tentei fazer semelhante em meu código mas, não funcionou.

O que estou fazendo de errado para que o meu não funcione?

Desde já agradeço.

Até mais…

carlos_hen

Tenta assim:

@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) 
@JoinColumn(name="codSolicitacao") 
public Collection<Reserva> getColReserva() {
}

Ou seja, cada reserva terá uma código de Solicitaçao.

@JoinTable deverá ser usado se vc tem uma terceira tabela nesse caso, para fazer a junção entre solicitação e reserva.
É este o caso?

Abs.

G

Bom pessoal, primeiramente obrigado a todos pelas respostas!

carlos_hen, tentei dessa forma que vc indicou e o erro que foi apresentado na tela foi: “but this mapping cannot have columns in this context.”

Mais informações sobre o ambiente para ver se vocês podem me ajudar.

Estamos usando banco de dados Oracle e OpenJPA 1.2.1 e preciso que ao inserir uma solicitação de reserva as suas reservas que estarão dentro da Collection devem ser inseridas em seguida.

O que tenho percebido é que a reserva não está pegando automaticamente o código da sua solicitação, que teoricamente deveria estar sendo incluída antes da reserva.

Vejo as querys bunitinhas através da console do eclipse, inclui a solicitação e depois vem as querys de inclusão das reservas, mas, a coluna codSolicitação vem vazia na hora de incluir e por isso da erro (obvio).

As annotations estão conforme o primeiro tópico quando acontece o que descrevi acima.

Mais uma vez obrigado a todos!

Criado 29 de novembro de 2011
Ultima resposta 6 de dez. de 2011
Respostas 9
Participantes 3