Duvida Mapeamento Hibernate

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.

Quem puder me ajudar. Grato desde já

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>

neste site está mostrando várias maneiras de one-to-many:
http://www.java2s.com/Code/Java/Hibernate/OneToManyMappingList.htm

eu acabei de postar uma dúvida no guj, sobre como seria a inserção, se vc conseguir por favor me avise!!

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!

ainda tudo é confuso pra mim :cry:

e o mapeamento da classe ItemPedido como ficaria mais ou menos?

Grato.

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

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
  <class name="PedidoItem" table="PEDIDOITEM">
  	<id name="idPedidoItem" type="long" column="IDPEDIDOITEM">
  		<generator class="native" />
  	</id>
  	<property name="produto" type="string" column="PRODUTO" />
  	<property name="valorUnit" type="double" column="VALORUNIT" />
  	<property name="quant" type="integer" column="QUANTIDADE" />
  </class>
</hibernate-mapping>

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:

<hibernate-configuration>
	   <session-factory>

	   	<!-- Use a Tomcat 5.5 JNDI datasource -->
        <property name="hibernate.connection.datasource">java:comp/env/jdbc/empresa</property>
		<property name="current_session_context_class">thread</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

	   	<!-- Disable second-level cache. -->
		<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
	   	<!-- Print SQL to stdout. -->
	   	<property name="show_sql">true</property>

	   	<mapping resource="bean/Pedido.hbm.xml" />
	   	<mapping resource="bean/PedidoItem.hbm.xml" />
	   </session-factory>
</hibernate-configuration>

no seu exemplo vc tem um idPedidoItem, certo, já no meu é uma chave composta por “Produto” e “Venda”.

Grato.

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 :?

Grato.

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);

este é o mapeamento da chave composta

  <class name="Hibernate" table="HIBERNATE">
  	<composite-id name="hibernate_id" class="Hibernate">
  		<key-property name="id" column="ID" />
  		<key-property name="nome" column="NOME" />
  	</composite-id>
  	<property name="senha" type="string" column="SENHA" />
  </class>

Porque usar o annotation ao invés do xml?
Queria saber como usar isso mas eu não entendo!

vlw, foi exatamente isso que eu fiz.

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!

Estou perguntando sobre como salvar no método one-to-many

[quote=ThiagoWorldCoder]Porque usar o annotation ao invés do xml?
Queria saber como usar isso mas eu não entendo![/quote]

  1. Se vc usar XML vai ter que manter dois arquivos ao invés de um, para cada classe persistente
  2. O esquema de annotations é mais próximo ao padrão da JPA
  3. É mais fácil identificar se uma determinada classe é persistente, basta abrir o arquivo e ver se existem as devidas anotações.
  4. Você pode usar o esquema de autocomplete de sua IDE preferida.

Para aprender a usar annotations, pesquisa na documentação do Hibernate Annotations

Obrigado pela dica!
E sobre o esquema de one-to-many? Eu estou apanhando com isso… eu fiz o mapeamento, mas e como faço a inserção?