[AJUDA] Hibernate Mapeamento/Insercao/Relacionamento

1 resposta
joeroots

Eai galera, blz?
To tentando inserir alguns dados utilizando hibernate mas estou com alguns problemas que já rodei a net e não consegui funcionar…
vamos:

Tenho o seguinte Cenário:
1 Pedido que possui muitos items de pedidos…
criei entao as seguintes entidades:

Pedido:

@Entity
public class Pedido {
	
	@Id
	@GeneratedValue
	private Long id;
	private String nomeCliente;
	
	@OneToMany(mappedBy="pedido")
	private List<ItemPedido> itemPedidos;
                
                ... getters and setters..

ItemPedido:

@Entity
public class ItemPedido {
	
	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	
	@ManyToOne
	@JoinColumn(name="pedido_fk")
	private Pedido pedido;

                ... getters and setters ...

Esse é o codigo das entidades…e para testar utilizei os seguintes comandos:

... main ...
                
                ItemPedido i1 = new ItemPedido();
                i1.setNome("Carne");
		
	ItemPedido i2 = new ItemPedido();
	i2.setNome("Miojo");
		
	ItemPedido i3 = new ItemPedido();
	i3.setNome("Refrigerante");
		
	Pedido pedido = new Pedido();
	pedido.setNomeCliente("Extrax SuperMercados");
	pedido.setItemPedidos(Arrays.asList(i1, i2, i3));
		
	dao.adicionar(pedido);

Usei como base a propria doc do hibernate para annotations, já que testei alguns exemplos que achei ate aqui mesmo no forum e nao tive resultado…
Na documentacao diz que é nescessario apenas colocar a anotação @OneToMany e a condição mappedBy que iria funcionar…utilizando esse esquema o código apenas insere o nome do Cliente na tabela pedido.
Então inseri o condição CascadeType.ALL na classe Pedido e ele insere os dados do pedido e dos Items de Pedido, porem quando eu olho no banco a coluna pedido_fk fica nula, pq??!??!

Uma forma alternativa que eu vi, era um exemplo que no setItemPedidos era feito um for e para cada ItemPedido.pedido era dado a referencia dele mesmo…
ex:

public void setItemPedidos(List<ItemPedido> itemPedidos) {
        this.itemPedidos = itemPedidos;
        for(ItemPedido itemPedido : itemPedidos){
             itemPedido.setPedido(this);
        }
}

Nesse exemplo consegui assimilar o pedido_fk ao id do produto…
Mas ao utilizar isso no ambiente web, no meu caso utilizando o struts2 temos o mesmo problema novamente…
ou seja, o metodo alternativo falha…

Se alguem já utilizou esse tipo de mapeamento no Hibernate utilizando ANNOTATIONS e puder me ajudar ficarei grato…

Obrigado,

1 Resposta

von.juliano

Pra resolver isso é só anotar a lista de ItensPedido com @Cascade(CascadeType.SAVE_UPDATE), assim:

@OneToMany(mappedBy = "pedido") @Cascade(CascadeType.SAVE_UPDATE) private List<ItemPedido> itemPedidos;Tanto Cascade quanto CascadeType são do pacote org.hibernate.

Vê se resolve! Flw! :thumbup:

Criado 1 de dezembro de 2010
Ultima resposta 3 de dez. de 2010
Respostas 1
Participantes 2