Problemas List + Hibernate

[quote=rogelgarcia][quote=TheKill]eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui[/quote]

É por isso que no Next… essas funcionalidades todas aí… eu nao faço com o hibernate…
Dou um drop nele… para ele nao controlar NADA
E tenho classes que fazem isso dinamicamente… nao dá essa problematica toda…[/quote]

se vc precisar um dia, so atualizar os dados, vai ter q fazer algo como

[code]Objeto dadosNovos = objetoRecebidoParaAtualizar

target = session.load(Objeto.class,dadosNovos.getId());

target.setNome(novo.getNome());
target.setAltura(novo.getAltura());
//etc
//etc[/code]

[quote=Lavieri][quote=rogelgarcia]Lavieri Aproveitando a discussão aqui, uma opiniao sua…

Voce nao acha que é ruim vc definir como os dados devem ser persistidos e forma estática uma coisa ruim?!

Nao deveria ter uma forma de fazer isso programaticamente?!

Por exemplo, as vezes numa situacao vc iria querer um comportamento e em outra situacao outro comportamento… definindo isso de forma estática… vc só tem um comportamento para a aplicacao inteira…[/quote]

nao da pra fazer isso…

isso e’ o mesmo que vc falar que a tabela vai ficar mutavel.[/quote]

Nao nao… tipo… ao invés de definir estaticamente (com anotacoes)… que o hibernate deve tomar conta dos child (casacade…delete orphan essas coisas)

Tudo nao ser controlado pelo hibernate…
E quando vc for salvar vc escolhe

Tipo isso

[quote=Lavieri][quote=rogelgarcia][quote=TheKill]eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui[/quote]

É por isso que no Next… essas funcionalidades todas aí… eu nao faço com o hibernate…
Dou um drop nele… para ele nao controlar NADA
E tenho classes que fazem isso dinamicamente… nao dá essa problematica toda…[/quote]

se vc precisar um dia, so atualizar os dados, vai ter q fazer algo como

[code]Objeto dadosNovos = objetoRecebidoParaAtualizar

target = session.load(Objeto.class,dadosNovos.getId());

target.setNome(novo.getNome());
target.setAltura(novo.getAltura());
//etc
//etc[/code][/quote]

Nao… o drop nao é tao grande assim… :smiley:

É só para ele nao controlar os childs e essas coisas…

Vou dar um exemplo de como é no Next só pra se ter uma ideia…

       new SaveOrUpdateStrategy(venda)
                .saveEntity()
                .saveOrUpdateManaged("itensVenda") //isso aqui faz todo o trabalho necessário para atualizar os detalhes.. mas eu escolho se eu quero fazer ou nao.. no código... e nao com anotacoes
                .execute(); //aqui será aberta uma transacao para realizar as operacoes

[quote=Lavieri][quote=TheKill]nao… eu estava reclamando é que…

se eu to fazendo um update de uma lista de itens venda… onde pode ser > 1
eu vou dar update em N produto… pode ser em todos ou não… ele nao apaga os registros que não foram atualizados…
mais ou menos isso…[/quote]

se vc colocar a anotacao que eu falei…

todos os itensDeVendas que nao estiverem dentro da lista, na hora do .marge() serao excluidos[/quote]

Eu fiz como vc citou das @anotation mas continua nao excluindo na tabela ItemVenda…
Mesmo eu listando apenas 1 item venda para ser atualizado… uma lista com 6 itens vendidos

@OneToMany(cascade=CascadeType.ALL, mappedBy="venda")
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinColumn(name="cd_venda")
	private List<ItemVenda> listaItemVenda

mostra o comando q vc esta fazendo

                Venda v = new Venda();
		VendaJdbc vj = new VendaJdbc();

		Calendar calendar = Calendar.getInstance();
		calendar.getTime();
		try {
			v = vj.consultar(1);
		} catch (ExcessaoDAO e2) {
			e2.printStackTrace();
		}
		
		List<ItemVenda> listItemVenda = new ArrayList<ItemVenda>();
		ItemVenda iv = new ItemVenda();
		Produto p = new Produto();
		ProdutoJdbc pr = new ProdutoJdbc();
		try {
			p = pr.consultar(2);
		} catch (ExcessaoDAO e1) {
			e1.printStackTrace();
		}
		
		iv.setCodigo(1);
		iv.setProduto(p);
		iv.setVenda(v);
		
		listItemVenda.add(iv);

                iv.setProduto(p);
		iv.setVenda(v);
		listItemVenda.add(iv);
		
		v.setListaItemVenda(listItemVenda);
		
		vj = new VendaJdbc();
		try {
			vj.alterar(v);
		} catch (ExcessaoDAO e) {
			e.printStackTrace();
}

ps.: formatar codigo nesse code is impossible

  		iv.setCodigo(1); 
		iv.setProduto(p); //isso
		iv.setVenda(v); // e isso
		
		listItemVenda.add(iv); //#1

                iv.setProduto(p); // esta repetido aki
		iv.setVenda(v); // e aqui
		listItemVenda.add(iv); // em #1 vc esta adiconando o mesmo objeto
		
		v.setListaItemVenda(listItemVenda);
}

para ter 2 objetos vc precisa fazer apos o add um iv = new BalBalBla()

Sim sim… eu devo ter apagado sem querer…

mas o fato nao era esse…

o fato é que eu tenho 6 itens na table de itens vendas… mandei atualizar 1 ou 2
e ele manteve os 6 itens

bom vamos la, se quer realmente q te ajude, vai ter q me ajudar

v
iv
p

são coisas ilegiveis, fica horrivel de ver o codigo… use nomes descritivos, para que se possa entender

tenta isso aqui abaixo

[code]Produto produto = session.load(Produto.class,2);
Venda venda = new Venda();

venda.addItemVenda(produto).setId(1); //se isso aqui nao existe na sua classe é pq vc gosta de dificultar =P
venda.addItemVenda(produto).setId(2);

session.marge(venda);[/code]

so pra te ajudar, segue o codigo do addItemVenda

public class Venda { //... public ItemVenda addItemVenda(Produto produto){ ItemVenda itemVenda = new ItemVenda(); itemVenda.setVenda(this); itemVenda.setProduto(produto); this.getItensVenda().add(itemVenda); //obs.: se isso aqui der NPE, é pq vc não esta instanciado a lista corretamente return itemVenda; } //... }

tenta isso ai… e vê se não funciona

vou tentar simplificar o codigo pra ver se consegue entender…
beleza?
Desculpe pelo transtorno, estou tentando aprender sobre Hibernate…
e nao sei você, mas no inicio costumamos patinar até pegar a caida do negócio…

vou postar o código abaixo:

		Venda venda = new Venda();
		VendaJdbc vendaJdbc = new VendaJdbc();

		Calendar calendar = Calendar.getInstance();
		calendar.getTime();
		try {
			venda = vendaJdbc.consultar(1);
		} catch (ExcessaoDAO e2) {
			e2.printStackTrace();
		}
		
		List<ItemVenda> listItemVenda = new ArrayList<ItemVenda>();
		ItemVenda itemVenda = new ItemVenda();
		Produto produto = new Produto();
		ProdutoJdbc produtoJdbc = new ProdutoJdbc();
		try {
			produto = produtoJdbc.consultar(2);
		} catch (ExcessaoDAO e1) {
			e1.printStackTrace();
		}
		
		itemVenda.setCodigo(1);
		itemVenda.setProduto(produto);
		itemVenda.setVenda(venda);
		listItemVenda.add(itemVenda);
		
		venda.setListaItemVenda(listItemVenda);
		vendaJdbc = new VendaJdbc();
		try {
			vendaJdbc.alterar(venda);
		} catch (ExcessaoDAO e) {
			e.printStackTrace();
		}

esplicando a situação acima do codigo…

venda = vendaJdbc.consultar(1);
//faz a consulta na tabela Venda e atribui o resultado ao objeto venda que é do tipo Venda;

produto = produtoJdbc.consultar(2); 
//faz a consulta na tabela Produto e atribui o resultado ao objeto produto que é do tipo Produto;

itemVenda.setCodigo(1);  
...
listItemVenda.add(itemVenda);  
//adiciona 1 elemento para atualizar na tabela de ItemVenda;


venda.setListaItemVenda(listItemVenda); 
//adiciona a lista de itens para ser atualizados na venda;

//e por fim
vendaJdbc.alterar(venda);
//manda atualizar a venda com o objeto venda;

quando vc faz isso

venda = vendaJdbc.consultar(1);

todas os itensvenda vem pendurado … pode ser isso

tente fazer da forma q te falei, e veja se funciona

até tentei fazer do que jeito que vc comentou,

mas nao tive muito sucesso hehe

vou postar as classes aqui em anexo…
ai se você puder olhar… agradeço muito…
e desculpe ficar enchendo de pedidos de ajuda ^^

ainda acho que vc não esta colando o código real aqui…

eu fiz aki, e deu certo, a casacata

vc ja deu uma olhada no codigo que eu postei??

cara desculpe mesmo, odeio ficar dependendo de outras pessoas, mas esse hibernate tá dando dor de cabeça hehe

valeu pelo grande help e paciência em tentar ajudar ^^

try it

http://pastebin.com/5GWqhnfc

http://pastebin.com/N7Vmjv99

http://pastebin.com/7XgNYAgD

dei umas leves alterações

mas falta o trecho da logica q vc esta executando