Salve galera. Meu problema é simples para os que já entendem, mas creio q mais pessoas tiveram essa dúvida. Estou tentando dar uma estudadinha no hibernate agora usando XML, e estou com dúvida para mapear o seguinte.
//atributos da classe Venda
private int venda;
private Cliente cliente;
private Date dataVenda;
private Double valorVenda;
private List<ItemVenda> itensVenda;
[/code][code]
//atributos da classe ItemVenda
private Produto produto;
private int quantidade;
estou querendo fazer um mapeamento para na hora de gravar na tabela Venda e também gravar na tabela intermediária(n-n) item_venda onde a mesma contém os seguintes campo: “venda(PK/FK), produto(PK/FK), quantidade”. Ví algo sobre composite-id, mas gostaria de saber como mapear sem alterar minhas classes.
Estou passando pelo mesmo problema, mas eu já sei sobre o mapeamento!!
sobre o set aí, é um mapeamento onde eu tenho uma lista do tipo set, você pode ter de várias maneiras.
<class name="Pedido" table="PEDIDO">
<id name="codigo" type="long" column="CODIGO">
<generator class="native" />
</id>
<!-- Se quiser inserir apenas alguns campos basta deletar ou
comentar os properties que estão aqui e não esqueça de comentar ou
deletar também os campos correspondentes no bean. -->
<property name="obs" type="string" column="OBS" />
<property name="data" type="string" column="DATA" />
<property name="valorTotal" type="double" column="VALORTOTAL" />
<property name="ativo" type="boolean" column="ATIVO" />
<set name="itens" cascade="all">
<key column="PEDIDOITEM" />
<one-to-many class="PedidoItem"/>
</set>
acho que eu não expliquei muito bem sobre o set… é que eu poderia ter do tipo List, ArrayList e muitos outros, no meu caso eu estou tentando usar o set, o name é o nome da variável que está na minha classe, no caso itens, e cascade, significa que ele vai fazer o insert ou delete ou update de todos automaticamente, aí vc decide como vai fazer, pode escrever só save mesmo em cascade, para só habilitar o save, o key column, é o nome da coluna que tem o id da chave extrangeira como referência, e o class indica a minha outra classe que representa a minha tabela estrangeira!
pra mim também muitas coisas são confusas!! :lol:
mas o mapeamento do ItemPedido ficaria assim:
o id que se refere à chave primaria e os properties são das outras colunas
esses mapeamentos xml, vc pode colocá-los no pacote aonde estão as suas classes que vc mapeou!
e é claro, dentro do hibernate.cfg.xml que é aonde tem a configuração do hibernate, vc tem que indicar os mapeamentos que você fez, por exemplo:
consegui usando o composite-id, criando uma classe chamada ItemVendaPK com os atributos Venda e Produto, e na ItemVenda ficou os atributos ItemVendaPk e quantidade. Será que da forma que as classes estavam não tem como fazer não, sem precisa do composite-id e de outra classe :?
Bom, tem gente que gosta, mas se eu fosse vocês deixaria o mais rápido possível de usar esses XMLs e passaria a usar annotations para fazer os mapeamentos…
vou te mostrar um exemplo de chave composta então!
não sei se você colocou a sua classe bean como serialização, mas é necessário, e lá vc vai colocar um construtor: veja como ficou uma classe bean minha:
vc precisa criar uns métodos equals e hashcode, não sei pra que serve ainda!
import java.io.Serializable;
public class Hibernate_id implements Serializable {
private int id;
private String nome;
public Hibernate(){}
public Hibernate(int id, String nome){
this.id = id;
this.nome = nome;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Hibernate)) return false;
final Hibernate hibernate_id = (Hibernate) obj;
if(!nome.equals(hibernate_id.getNome())) return false;
if(id != hibernate_id.getId()) return false;
return true;
}
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + id;
result = PRIME * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
e na sua classe principal hibernate, aonde havia os ids, vc substitui eles por uma variável do tipo da classe que acabou de criar, por exemplo Hibernate_id como abaixo:
public class Hibernate {
private Hibernate hibernate_id;
private String senha;
public Hibernate getHibernate_id() {
return hibernate_id;
}
public void setHibernate_id(Hibernate hibernate_id) {
this.hibernate_id = hibernate_id;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
quando vc implementar e for salvar vai ser assim:
//instancie a classe e logo de cara vc passa os ids!, no caso eu interpretei como se o id fosse auto-incremento
//e o nome não aí eu só passo o nome, mas senão vc passa os dois, aí depois disso vc salva...
Hibernate hiber = new Hibernate(new Hibernate_id("meu nome"));
getSession.save(hiber);
Cassio, eu acho muito show os annotations e fácil hehe, mas é por estudo mesmo os xml. Aproveitando, como ficaria minhas duas classes com annotation? Grato.
Deixa eu te perguntar, vc conseguiu fazer uma inserção?
Se conseguiu? como fez?
Vc conhece algum site que explica direito annotation? estou querendo aprender isso também!