Conhecendo JPA

8 respostas
gui_sv

Existe alguem que conheça muuuito de JPA ???

Qual é a especificação do JPA com relacao ao JBoss 5 ???

Devo usar JPA c/ Hibernate … ou utilizar Hibernate puro ???

Obrigado.

8 Respostas

P

não sei se conheço tanto qto vc espera. rs

utilizo jpa em dois projeto. um dos projetos uso toplink+JPA e no outro hibernate+JPA. No passado utilizei num projeto o Hibernate puro. Conclusão, todas essas opções são praticamente identicas. Fica a gosto do fregues.

abraços

gui_sv

palmadias:
não sei se conheço tanto qto vc espera. rs

utilizo jpa em dois projeto. um dos projetos uso toplink+JPA e no outro hibernate+JPA. No passado utilizei num projeto o Hibernate puro. Conclusão, todas essas opções são praticamente identicas. Fica a gosto do fregues.

abraços

vc já tem uma certa experencia … legal …

como que vc utiliza chave composta ???

Nos casos da Anotação @OneToMany … vc cria uma tabela associativa ou manda o id da classe para outra table ??? o que é melhor ??

vlw cara

P
como que vc utiliza chave composta???

tenho uma classe que define cada chave composta, por exemplo:

public class ProdutoPK implements Serializable {
	/** Atributo que mapeia o campo CD_MDUPR. */
	@Id
	@Column(name="CD_MDUPR",nullable=false)
	public Long cdMdupr;
	/** Atributo que mapeia o campo SQ_CRIVO_RENOV. */
	@Id
	@Column(name="SQ_RENOV",nullable=false)
	public Long sqRenov;

	/**
	 * Construtor da classe.
	 */
	public ProdutoPK () {
	}

	/**
	 * Construtor da classe.
	 * @param cdMdupr valor do atributo cdMdupr
	 * @param sqRenov valor do atributo sqRenov
	 */
	public ProdutoPK (Long cdMdupr,Long sqRenov) {
		this.cdMdupr = cdMdupr;
		this.sqRenov= sqRenov;
	}

	public boolean equals(Object other) {
		if(other instanceof ProdutoPK ) {
			final ProdutoPK pk = (ProdutoPK ) other;
			boolean ret = (pk.cdMdupr.equals(cdMdupr) && pk.sqRenov.equals(sqCrivoRenov));
			return ret;
		}
		return false;
	}

	public int hashCode() {
		return cdMdupr.hashCode() ^ sqRenov.hashCode();
	}

}
Nos casos da Anotação @OneToMany ... vc cria uma tabela associativa ou manda o id da classe para outra table ??? o que é melhor ??
Particularmente prefiro mapear minhas entidades sem relacionamento por questão de performance. Mas olhando de fora, relaçoes @OneToMany eu colocaria a entidade relacionada como um atributo da classe.

acho que é isso

g4j

Olá,

Interessante o teu comment. Eu uso hibernate com lazy load e sempre me pareceu bem rápido.

Algum outro motivo em especial pra não mapear os relacionamentos?

Abraço!

L

Se a sua tabela associativa tiver apenas as chaves extrangeiras das tabelas que esta associando, vc pode usar @ManyToMany, mas se tiver um campo se quer, vc precisa de um @Entity

O próprio hibernate desaconselha usar ManyToMany

Aqui vc pode ler mais

http://www.hibernate.org/hib_docs/reference/en/html/best-practices.html

Sobre chaves compostas, se vc tiver a chance de criar e definir as tabelas, tenta não usar elas. Eu prefiro usar um identificador que não tem nada a ver com negócio como chave primária (um long da vida auto generated) e os atributos que fariam parte da chave composta, eu criaria uma chave unica.

Sobre JPA e Hibernate, a falta de uma api de Criteria no JPA versão atual, faz com que eu largue mão de usar apenas a especificação e use algo do Hibernate, porém se vc tiver alguma ideia de um dia mudar do Hibernate para o Toplink ou qualquer outro provider, então use apenas a especificação (JPA)

gui_sv

luBS:
Se a sua tabela associativa tiver apenas as chaves extrangeiras das tabelas que esta associando, vc pode usar @ManyToMany, mas se tiver um campo se quer, vc precisa de um @Entity

O próprio hibernate desaconselha usar ManyToMany

Aqui vc pode ler mais

http://www.hibernate.org/hib_docs/reference/en/html/best-practices.html

Sobre chaves compostas, se vc tiver a chance de criar e definir as tabelas, tenta não usar elas. Eu prefiro usar um identificador que não tem nada a ver com negócio como chave primária (um long da vida auto generated) e os atributos que fariam parte da chave composta, eu criaria uma chave unica.

Sobre JPA e Hibernate, a falta de uma api de Criteria no JPA versão atual, faz com que eu largue mão de usar apenas a especificação e use algo do Hibernate, porém se vc tiver alguma ideia de um dia mudar do Hibernate para o Toplink ou qualquer outro provider, então use apenas a especificação (JPA)

Muito bom post…

No meu caso, eu só tenho as chaves da tabela que estou associando… mas ja que esta dando erro, que eu nao sei o que é, vou tentar fazer com “OneToMany”.

Dai como ficara, terei que criar um .class para a tabela associativa?

vc tem algum exemplo?

vlww

L

Minhas tabelas associativas geralmente tem mais dados, e eu ainda crio uma chave primaria, evito usar chaves compostas.

Mas enfim, essa entidade associativa tera no caso dois @ManyToOne, um para cada tabela que vc quer associar

exemplo:

@Entity
public class A {
  ...
}

@Entity
public class B {
  ...
}

@Entity
public class AB {

  @ManyToOne
  @JoinColumn(nullable = false)
  private A a;

  @ManyToOne
  @JoinColumn(nullable = false)
  private B b;

}

No caso do Entity AB vc pode criar uma chave composta do atributo A e B ou então criar id normal long como em outras entidades.

De qualquer forma, qual erro esta dando no seu @ManyToMany?! segue um exemplo:

@Entity
public class A {
  
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  @ManyToMany
  @JoinTable(name = "tab_ab", 
           joinColumns = @JoinColumn(name = "id_a", referencedColumnName = "id"), 
           inverseJoinColumns = @JoinColumn(name = "id_b", referencedColumnName = "id"))
  private Collection<B> bs;
  ...
}

@Entity
public class B {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  @ManyToMany
  @JoinTable(name = "tab_ab", 
           joinColumns = @JoinColumn(name = "id_b", referencedColumnName = "id"), 
           inverseJoinColumns = @JoinColumn(name = "id_a", referencedColumnName = "id"))
  private Collection<B> bs;
  ...
}
gui_sv

luBS:
Minhas tabelas associativas geralmente tem mais dados, e eu ainda crio uma chave primaria, evito usar chaves compostas.

Mas enfim, essa entidade associativa tera no caso dois @ManyToOne, um para cada tabela que vc quer associar

exemplo:

@Entity
public class A {
  ...
}

@Entity
public class B {
  ...
}

@Entity
public class AB {

  @ManyToOne
  @JoinColumn(nullable = false)
  private A a;

  @ManyToOne
  @JoinColumn(nullable = false)
  private B b;

}

No caso do Entity AB vc pode criar uma chave composta do atributo A e B ou então criar id normal long como em outras entidades.

De qualquer forma, qual erro esta dando no seu @ManyToMany?! segue um exemplo:

@Entity
public class A {
  
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  @ManyToMany
  @JoinTable(name = "tab_ab", 
           joinColumns = @JoinColumn(name = "id_a", referencedColumnName = "id"), 
           inverseJoinColumns = @JoinColumn(name = "id_b", referencedColumnName = "id"))
  private Collection<B> bs;
  ...
}

@Entity
public class B {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private Long id;

  @ManyToMany
  @JoinTable(name = "tab_ab", 
           joinColumns = @JoinColumn(name = "id_b", referencedColumnName = "id"), 
           inverseJoinColumns = @JoinColumn(name = "id_a", referencedColumnName = "id"))
  private Collection<B> bs;
  ...
}

Obrigado luBS.

O erro que ocorre tem maiores detalhes em um post que abri. Veja: http://www.guj.com.br/posts/list/119563.java

Criado 3 de março de 2009
Ultima resposta 4 de mar. de 2009
Respostas 8
Participantes 4