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!