Problemas List + Hibernate

63 respostas
TheKill

Pessoal… estou em um dilema.

Vendas / ItemVenda

ao finalizar uma venda, automaticamente possuo um List com minha lista de itens vendidos.
o problema é o segunite!

Se envio uma lista com 1 elemento, tudo certo tudo perfeito.
mas ao enviar uma lista com mais de 1 elemento, PUFF violação de chava

Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert collection: [br.com.caelum.hibernate.negocio.entidade.Venda.listaItemVenda#2]
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1205)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:171)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at br.com.caelum.hibernate.persistencia.hibernate.VendaJdbc.incluir(VendaJdbc.java:69)
	at br.com.caelum.hibernate.testeVenda.main(testeVenda.java:53)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "INTEG_104" on table "ITEMVENDA"
	at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
	at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:190)
	at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1168)
	... 11 more

Alguem sabe porque? Como solucionar este problema??

Att. Jonas

63 Respostas

rogelgarcia

Voce está usando um sequence o @Id de itemVenda?

Posta suas classes e o código

TheKill

@id

TheKill
@Entity
@Table(name="ItemVenda")
public class ItemVenda implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@SequenceGenerator(name = "codigo", sequenceName = "GNT_ITEM_VENDA", allocationSize = 1) 
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codigo")
	@Basic(optional = false)
	@Column(name = "codigo")
	private int codigo;
	
	@OneToOne(cascade = CascadeType.ALL)  
	@JoinColumn(name = "cd_produto", referencedColumnName="codigo")  
	@Fetch(FetchMode.JOIN)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	Produto produto;
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "cd_venda", referencedColumnName="codigo")
	@Fetch(FetchMode.JOIN)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	Venda venda;
	
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	public Venda getVenda() {
		return venda;
	}
	public void setVenda(Venda venda) {
		this.venda = venda;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final ItemVenda other = (ItemVenda) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

}
TheKill
@Entity
@Table(name="Venda")
public class Venda implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@SequenceGenerator(name = "codigo", sequenceName = "GNT_VENDA", allocationSize = 1) 
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codigo")
	@Basic(optional = false)
	@Column(name = "codigo")
	private int codigo;
	
	@Basic(optional = true)
	@Column(name = "nome", length=50)
	private String nome;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "dt_venda")
	private Calendar dataVenda;
	
	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn(name="codigo")
	private List<ItemVenda> listaItemVenda;
	
	public List<ItemVenda> getListaItemVenda() {
		return listaItemVenda;
	}
	public void setListaItemVenda(List<ItemVenda> listaItemVenda) {
		this.listaItemVenda = listaItemVenda;
	}
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Calendar getDataVenda() {
		return dataVenda;
	}
	public void setDataVenda(Calendar dataVenda) {
		this.dataVenda = dataVenda;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Venda other = (Venda) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

	public int compareTo(Venda o) {
		if(this.getNome().compareTo(o.getNome()) < 0) 
			return -1 ; 
		if(this.getNome().compareTo(o.getNome()) > 0) 
			return 1; 
		return 0; 
	}

	public String toString() {
		return nome;
	}

	
}
TheKill
public class testeVenda {
	public static void main(String[] args) {
		
		Produto p = new Produto();
		p.setNome("acucar");
		p.setPreco(new BigDecimal(3));
		p.setQuantidade(1);
		
		ProdutoJdbc pJbc = new ProdutoJdbc();

		try {
				pJbc.incluir(p);
			} catch (ExcessaoDAO e) {
				e.printStackTrace();
		}
		
		
		Venda v = new Venda();

		Calendar calendar = Calendar.getInstance();
		calendar.getTime();
		v.setDataVenda(calendar);
		v.setNome("pedro");
		
		List<ItemVenda> listItemVenda = new ArrayList<ItemVenda>();
		ItemVenda iv = new ItemVenda();
		iv.setProduto(p);
		iv.setVenda(v);
		listItemVenda.add(iv);
		
		v.setListaItemVenda(listItemVenda);
		
		VendaJdbc vj = new VendaJdbc();
		try {
			vj.incluir(v);
		} catch (ExcessaoDAO e) {
			e.printStackTrace();
		}
	
	}
}
rogelgarcia

Troca isso:

@OneToMany(cascade=CascadeType.ALL)  
    @JoinColumn(name="codigo")  
    private List<ItemVenda> listaItemVenda;

por

@OneToMany(cascade=CascadeType.ALL, mappedBy="produto")  
    private List<ItemVenda> listaItemVenda;
Lavieri

evite anotações nos FIELDS, use elas nos métodos =x … isso vai te ajudar quando vc precisar fazer tratamento dos inputs ou outputs

TheKill

Nao resolveu hehe

rogelgarcia

Lavieri:
evite anotações nos FIELDS, use elas nos métodos =x … isso vai te ajudar quando vc precisar fazer tratamento dos inputs ou outputs

Quais tratamentos Lavieri??

rogelgarcia

Veja no banco… se produto ou venda… tem um unique key… em itemvenda…

Veja a constraint INTEG_104… o que ela diz

Lavieri
rogelgarcia:
Lavieri:
evite anotações nos FIELDS, use elas nos métodos =x .... isso vai te ajudar quando vc precisar fazer tratamento dos inputs ou outputs

Quais tratamentos Lavieri??

por exemplo

@Entity
public class Produto {
       private Long id;
       private BigDecimal valor;
       private String descricao;
       private String nome;
       @Id @GeneratedValue
       public getId() {...}
       //...
       public BigDecimal getValor() {return valor}
       public void setValor(BigDecimal valor) { //#1
            this.valor = valor.equals(BigDecimal.ZERO) ? null : valor;
       }

       public String getNome() {return nome;}
       public void setNome(String nome) { //#2
            this.nome = nome == null || nome.trim().isEmpty() ? null : nome.trim();
       }
}

#1 aqui eu estou supondo, que no banco pode existir Produtos legados, sem valor, onde tem o valor ZERO, na verdade era para o campo estar NULL pois esse valor nao e' definido.

#2 aqui eu estou supondo que no banco, podem existir valores em branco, quando deveriam estar nulos.

O Hiberante usara o metodo SET quando as anotacoes forem nos metodos, o que e' melhor do que nos FIELDS, pois nos setters / getters vc consegue fazer tratamento na entrada ou na saida dos resutlados....

vc pode ate criar propriedades sem mesmo ter um FIELD para elas no objeto, por exemplo

@Entity
public void Brinde {

       public Integer getQuantidadeTickets() {return quantidadeTickets;}
       //...
       public boolean isGratis() {
            return getQuantidadeTickets() != null && getQuantidadeTickets().equals(0);
       }
       /**
         * Nao use para setar setGratis(false), isso e' ajustado automaticamente apos alterar a quantidade de tickets necessarias
         * para levar esse brinde. Pode ser usado para setGratis(true), o que altera automaticamente a quantidade de tickets para zero.
         * @deprecated usado apenas pela unidade de persistencia
         */
       @Deprecated
       protected void setGratis(Boolean gratis) {
            if (gratis != null && gratis)
                setQuantidadeTickets(0);
       }
}
enfim essas sao apenas duas possibilidades, o fato e' que com as anotacoes nos metodos, vc pode tratar dados vindo do banco, e nao vai ter seus objetos estuprados heheh injetando valores em suas propriedades privadas =x
Lavieri

nao resolveu, pq ele colocou o campo errado

//errado @OneToMany(cascade=CascadeType.ALL, mappedBy="produto") private List&lt;ItemVenda&gt; listaItemVenda;

//correto @OneToMany(cascade=CascadeType.ALL, mappedBy="venda") private List&lt;ItemVenda&gt; listaItemVenda;

o relacionamento Venda -> ItemVenda
e’ dado pela propriedade “venda” do objeto ItemVenda

TheKill

Pessoal, eu descobri… só que ainda não sei como solucionar.

O problema de violação é porque ele ta criando uma FK no ItemVenda onde não deve existir.
ta criando uma FK no meu @id que é meu generator… e por isso está dando violação de chave primária!!

alguem sabe porque? como resolver?

Att. Jonas

Lavieri

TheKill:
Pessoal, eu descobri… só que ainda não sei como solucionar.

O problema de violação é porque ele ta criando uma FK no ItemVenda onde não deve existir.
ta criando uma FK no meu @id que é meu generator… e por isso está dando violação de chave primária!!

alguem sabe porque? como resolver?

Att. Jonas

coloca o mappedby que ele para de colocar a fk la

TheKill

essa questao eu resolvi… agora o problema é outro… pode ajudar?

seguinte: sessao de update =/
estou tentando atualizar meus itens venda, mas qndo executo ele simplesmente gera um novo ID no item_venda com atributos null!!
ou seja eu mando atualizar o item venda de iD 2 e ele gera um novo ID com valor null !!!

Venda v = new Venda();

		Calendar calendar = Calendar.getInstance();
		calendar.getTime();
		v.setDataVenda(calendar);
		v.setNome("pedro");
		v.setCodigo(1);
		
		List&lt;ItemVenda&gt; listItemVenda = new ArrayList&lt;ItemVenda&gt;();
		ItemVenda iv = new ItemVenda();;
		Produto p = new Produto();
		p.setNome("petroleo");
		p.setPreco(new BigDecimal(79));
		p.setQuantidade(5);
		p.setCodigo(1);
		listItemVenda.add(iv);

v.setListaItemVenda(listItemVenda);
		
		VendaJdbc vj = new VendaJdbc();
		try {
			vj.alterar(v);
		} catch (ExcessaoDAO e) {
			e.printStackTrace();
		}
rogelgarcia

Lavieri mas quando vc anota o field… o hibernate nao continua usando o setter nao???

TheKill

Uma pergunta para os usuarios de Hibernate,

Uma situação que está me deixando com dúvidas:

Tenho uma venda, onde foi efetuado 3 produtos vendidos!
Agora em um update estou atualizando 1 produto, mantendo o 2 produto normal, e quero deletar o 3 produto.

Porem quando efetuei meu update, notei que ele apenas atualiza o item que está para ser alterado… já o resto ele nao faz nada!!!
Isto é normal? O update nao faz delete dos elementos Itens Vendidos que não foram mechidos no update?

Att. Jonas

Lavieri

nao!

ele faz por reflexao, acessa os campos diretamente, seta acessible como true, e invade o campo que era pra ser private setando seu valor, e portanto pode alterar o estado do objeto de uma forma nao esperada…

Lavieri

TheKill:
Uma pergunta para os usuarios de Hibernate,

Uma situação que está me deixando com dúvidas:

Tenho uma venda, onde foi efetuado 3 produtos vendidos!
Agora em um update estou atualizando 1 produto, mantendo o 2 produto normal, e quero deletar o 3 produto.

Porem quando efetuei meu update, notei que ele apenas atualiza o item que está para ser alterado… já o resto ele nao faz nada!!!
Isto é normal? O update nao faz delete dos elementos Itens Vendidos que não foram mechidos no update?

Att. Jonas

try it

venda = session.load(Venda.class,id); venda.getItensVendidos().remove(3);

o hiberante nao atualiza nao o relacionamento

rogelgarcia

nao!

ele faz por reflexao, acessa os campos diretamente, seta acessible como true, e invade o campo que era pra ser private setando seu valor, e portanto pode alterar o estado do objeto de uma forma nao esperada…

Q bagaça…

TheKill

Huum, mas isso fica bem complicado…

eu achei que o hibernate conseguia atualizar automaticamente…
dessa forma eu vou ter que fazer um remove pra cada elemento removido,
e outra vou ter que ficar controlando manualmente os objetos que devem ou não ser removidos :S

omg

TheKill

Como vcs fazem para controlar essa situação???

Lavieri

TheKill:
Huum, mas isso fica bem complicado…

eu achei que o hibernate conseguia atualizar automaticamente…
dessa forma eu vou ter que fazer um remove pra cada elemento removido,
e outra vou ter que ficar controlando manualmente os objetos que devem ou não ser removidos :S

omg

anota com isto

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

and be happy

agora vc tera q fazer algo como

venda = session.load(Venda.class,id); venda.getItensVenda().remove(0);

nao me lembro 100%, mas o objeto precisa ser gerenciavel…

TheKill

desta forma eu tenho de ter um objeto do tipo ItemVenda dentro de Venda?

o.O é isso mesmo?

Lavieri

TheKill:
desta forma eu tenho de ter um objeto do tipo ItemVenda dentro de Venda?

o.O é isso mesmo?

e nao e’ assim ?

TheKill

a meu ver não…
fica bem estranho isso…

eu tenho um objeto do tipo Lista de ItensVenda…

Lavieri

TheKill:
a meu ver não…
fica bem estranho isso…

eu tenho um objeto do tipo Lista de ItensVenda…

nao estou entendo o q vc esta faladno …

vc colocou no seu mapeanto exatamento isso

public class Venda private List&lt;ItensDeVenda&gt; itensDeVenda; }

TheKill

sim… a lista de itensVenda eu coloquei, pra pode inserir os itens que foram vendidos o.O

Lavieri

entao ? vc nao estava reclamando que queria apagar daquela forma ??

se quiser de outra forma pode ser

session.delete(itemDeVenda);

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…

Lavieri

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…

se vc colocar a anotacao que eu falei…

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

TheKill

mas entao nao preciso daquele venda.getItemVenda.removo(indice)

Lavieri

nao, aquilo foi um exemplo, com uma entidade gerenciavel, como vc da um load, ela vem com todos os filhos juntos…

AH! tome cuidade… se vc tentar atulizar apenas os dados, ao persistir, sem a lista de itens vendidos, todos os itens vendidos serao apagados =x

TheKill

eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui

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…

rogelgarcia

TheKill:
eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui

É 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…

Lavieri

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…

nao da pra fazer isso…

isso e’ o mesmo que vc falar que a tabela vai ficar mutavel.

rogelgarcia

Aí já emenda na outra discussao do JPA que criei em outro tópico… discutindo uma interface que é baseada numa implementacao… e coisa e tale…
Ao invés de o povo pensar em algo fácil… bolam mil arquiteturas que vao complicando… e as coisas que vc tem que fazer todo dia… dá um trabalho violento… cheio de porém…
(nao gosto de arquiteturas cheias de porem)

TheKill

já estou achando chato essa parte de persistencia para atualizar, apagar… “automaticamente”

Lavieri
rogelgarcia:
TheKill:
eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui

É 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...

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

Objeto dadosNovos = objetoRecebidoParaAtualizar

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

target.setNome(novo.getNome());
target.setAltura(novo.getAltura());
//etc
//etc
rogelgarcia

Lavieri:
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…

nao da pra fazer isso…

isso e’ o mesmo que vc falar que a tabela vai ficar mutavel.

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

rogelgarcia
Lavieri:
rogelgarcia:
TheKill:
eita poha, ta me saindo mais facil lidar com SQL

SAHDIUAHSiduhAIUDHuiHDsui

É 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...

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

Objeto dadosNovos = objetoRecebidoParaAtualizar

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

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

Nao.. o drop nao é tao grande assim... :D

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

rogelgarcia

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
TheKill

Lavieri:
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…

se vc colocar a anotacao que eu falei…

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

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

TheKill
@OneToMany(cascade=CascadeType.ALL, mappedBy="venda")
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinColumn(name="cd_venda")
	private List&lt;ItemVenda&gt; listaItemVenda
Lavieri

mostra o comando q vc esta fazendo

TheKill
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&lt;ItemVenda&gt; listItemVenda = new ArrayList&lt;ItemVenda&gt;();
		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

Lavieri
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()

TheKill

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

Lavieri

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

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

TheKill

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&lt;ItemVenda&gt; listItemVenda = new ArrayList&lt;ItemVenda&gt;();
		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();
		}
TheKill

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

quando vc faz isso

venda = vendaJdbc.consultar(1);

todas os itensvenda vem pendurado … pode ser isso

Lavieri

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

TheKill

até tentei fazer do que jeito que vc comentou,

mas nao tive muito sucesso hehe

TheKill

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

Lavieri

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

eu fiz aki, e deu certo, a casacata

TheKill

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 ^^

Lavieri

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

TheKill

certo… uma dúvida… nao existe esse “marge” seria merge?

att. Jonas

Lavieri

TheKill:
certo… uma dúvida… nao existe esse “marge” seria merge?

att. Jonas

ou yeah

TheKill

certo, entendi em partes oque vc fez…

TheKill

Lavieri, vc tem GTalk para podermos conversar?

obrigado pela ajuda

Criado 18 de março de 2010
Ultima resposta 19 de mar. de 2010
Respostas 63
Participantes 3