Alteração de objeto no Hibernate

bom dia pessoal, tudo bom?

Só queria saber uma coisinha bem simples.

Vamos supor q eu tenha q alterar apenas um dado do usuário,
como o nome por exemplo.

Então eu fiz assim, só pra testar:

   User user = new User();
   user.setIdUser(1); // qual alterar
   user.setName("Atualizacao do nome"); // o q eu quero alterar

   ss.save(user);

Da maneira acima não vai dar certo, pois todos os outros atributos
de user estão vázios, mas são obrigatórios na tabela
da base de dados.

Mas eu gostaria de saber se tem alguma maneira
de eu alterar somente um ou alguns dados de um ojbeto.

Se alguém puder ajudar.

Obrigado!

Abraço

User u = (User)session.load(User.class, pk);
u.setName("Daniel"); // propriedade que eu quero alterar;
session.update(u);

Jóia!!!

Eu tinha visto isso. de qualquer forma o objeto User é carregado
com todas as informações, mas está ótimo!

Obrigado!

Abraço

quando fazer o load, cuidado se a tabela tiver muitos relacionamentos…

se o mapping file não estiver bem configurado o Hibernate consultará tudo e não só esta tabela :wink:

O pior é q vai buscar de algumas outras tabelas, como por exemplo
ded department, perfil.

Use “lazy loading” para os relacionamentos. Assim só vai ser carregado o que fizer parte da tabela “User”, enquanto os dados referentes aos relacionamento são carregados meio que “on-demand”.

E ai Daniel, tudo beleza?

Deixa eu ver se eu entendi. Fazendo lazy=loading
Os dados dos objetos os quais o objeto User se relaciona,
somente serão carregados quando eu precisar ???

“on-demand” seria isso???

É sempre bom colocar lazy=loading???

Valew pela atenção!!!

abraço

O parâmetro de lazy-loading (ou lazy-initialization, nunca me lembro direito) deve ser declarado no relacionamento cujo carregamento deve ser feito “on-demand”.
É algo mais ou menos assim:

<set name="relacionamento1" table="minhaTabela" [b]lazy="true"[/b]>
    <key column="minha_pk"/>
    <element column="minha_FK" type="string"/>
</set>

Sobre o “on-demand”, é exatamente isso o que você entendeu. :slight_smile:

Mas então, o problema é mais abaixo.
Se minha tabela tiver muitos relacionamentos e eu precisar alterar alguma coisa em uma das tabelas relacionadas, o desempenho irá cair.
Exemplo: suponha que o departamento tenha uma Collection e que essa Collection seja relacionada com os empregados. Suponha que o objeto Empregado tenha diversos atributos, mas eu só quero modificar o atributo salário (dar um aumento pra todos os funcionários de um dado departamento, por exemplo). Então, quando eu carregar o departamento, ele vai ter que trazer todos os usuários e então eu vou iterar na coleção e ir alterando os salários e então salvar tudo de uma vez?
Isso não vai prejudicar o desempenho?
E se eu quisesse alterar o salário de apenas alguns usuários? Ainda teria que carregar todos os usuários do departamento?

Seria legal reviver este tópico…

Eu tenho a mesma duvida do mtakeda

ai o melhor é usar uma query direta e fazer processamento de lote mesmo…
http://www.hibernate.org/hib_docs/reference/en/html/batch.html