Update no hibernate

Pessoal, como eu faço um update, em um relacionamento one-to-many, sem ser bidirecional. Por exemplo, eu tenho pedido e item. Eu quero alterar o preço dos itens, que tem uma observação específica nos pedidos…

Thiago,

Você precisará ter a lista dos itens para então fazer o update deles. Lembre-se que o Hibernate no fim transforma tudo em SQL e, não existe (a não ser que eu esteja enganado) uma forma de fazer Update com relacionamento em SQL.

Portanto você pode fazer a consulta dos pedidos que possuem os ítens que você precisa alterar. Com a lista em mãos, simplesmente faça um merge para cada elemento da lista, ou seja, dos itens do pedido.

Se não ficou muito claro, ou se você precisar de algum exemplo é só falar.

Abraços.

Bom dia Norman, eu estou fazendo uns testes no hibernate, e aí eu cheguei nesse caso de update, suponha que eu quero fazer um update no preço dos itens que tenham pedidos com uma observação X! como seria o sql no hibernate? Será que o tal de Criteria ajudaria nesse caso ou não tem nada haver?

obrigado

Thiago,

Vamos supor que as suas duas classes mapeadas se parecam com essas:

public class Pedido {
   private Long id;
   private List<Item> itens;
   private String observacao;
   //getters e setters
public class Item {
   private long id;
   private Pedido pedido;
   private BigDecimal preco;
   //getters e setters

Como te falei, não existe a possibilidade de você montar um update em Item com uma restrição em Pedido. Então você terá de ter a lista de itens para fazer o update em cada um.

Utilizando Criteria você irá conseguir recuperar esta lista, ou seja:

Criteria criteriaPedido = session.createCriteria(Pedido.class);
List<Pedido> pedidos = criteriaPedido.add(Restrictions.eq("observacao", "X")).list();

Neste momento a lista de pedidos terá, em cada pedido, a lista de itens. (Obs: Não entrarei em detalhes de mapeamento Lazy. Para facilitar os seus testes, mantenha a session aberta.)

Agora o que você precisa fazer é percorrer esta lista de produtos, recuperando cada lista de itens para então fazer o update nela. Alguma coisa do tipo:

for (Pedido pedido : pedidos) {
   for (Item item : pedido.itens()) {
      item.setPreco(BigDecimal.valueOf(1.99));
      session.merge(item);
   }
}

Pronto! Agora você está alterando todos os preços dos itens que tem o pedido com uma observação X.

Acho que é só isso! Lembre-se de controlar a transação. Lembre-se que se seu mapeamento for Lazy então se a sessão estiver fechada no momento de recuperar a lista de itens você irá receber uma exceção.

Abraços.

valeu pela ajuda, era isso mesmo que eu estava querendo saber!!!
Feliz Natal e Ano Novo!