Hibernate: Inclusão de dados [RESOLVIDO]

Olá pessoal,

Sou novo por aqui, e antes de mais nada, quero dizer que é através deste fórum, que tiro muitas dúvidas e quero poder ajudar um dia o pessoal também. :smiley:
Bem, sou iniciante em Hibernate, estou começando a desenvolver uma pequena aplicação, tudo ia bem até que surgiu uma dúvida.

Digamos que eu tenha as seguintes classes e atributos:

//Usuario.java
public class Usuario {

        private Integer id;
	private String login;
        private Setor setor;
}

//Setor.java
public class Setor{

	private Integer id;
        private String setor;
}

Digamos que eu queira incluir um novo usuário no banco de dados:

Usuario usuario = new Usuario();
usuario.setNome("felipempantoja");

Digamos que do Setor, eu só tenha conhecimento do id.
Com o setor eu teria que passar o objeto Setor já carregado?

Eu fiz um teste dessa maneira e funcionou:

Setor setor = new Setor();
setor.setId(1);
usuario.setSetor(setor);

Fiz dessa forma pra não precisar ir no banco e recuperar o registro pelo id, funcionou mas assim fica muito feio e não sei se está correto.
No fim das contas:

Alguém tem uma idéia melhor de como incluir?

Só para ajudar, o sql do meu banco:

--Tabela Usuario
CREATE TABLE `usuario` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `setor_id` int(11) unsigned NOT NULL,
  `login` varchar(50) default NULL,
  PRIMARY KEY  (`id`),
  KEY `usuario_FKIndex4` (`setor_id`),
  CONSTRAINT `usuario_FKIndex4` FOREIGN KEY (`setor_id`) REFERENCES `setor` (`id`)
);

--Tabela Setor
CREATE TABLE `setor` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `setor` varchar(50) default NULL,
  PRIMARY KEY  (`id`),
)

Alguma sugestão? :smiley:

:smiley: ?

Não entendi muito bem o que você pretende fazer…
Mas se você quiser passar um id específico, vc tem que fazer uma consulta na tabela setor pra ver que id vc quer colocar na outra tabela!
me passa seu msn pra gente trocar idéias, eu também não muito bom em hibernate ainda, vc já conseguiu usar o JBoss? Eu só consigo usar o Tomcat no eclipse, estou apanhando bastante com JBoss!
qualquer coisa meu msn é thiagocoder@hotmail.com

Só tô no tomcat ainda rsrs… vou te adicionar sim quando chegar em ksa, aqui do trabalho msn off =/

Mas então, realmente não passei muito bem meu problema, ou melhor, dúvida.

É que eu acho que ficaria meio inviável ficar fazendo uma consulta por id de cada tabela afim de trazer o objeto carregado somente pra realizar um registro em uma única tabela.

Por exemplo: Minha tabela USUARIO, possui umas 6 chaves estrangeiras fazendo referência a outras tabelas… aí minha impressão, é que fazer uma consulta em cada tabela relacionada é meio sujo, fora que a performance ia pro espaço com monte de consultas…

Será que não existe uma solução mais produtiva e otimizada? ;x

Pelo que eu entendi, vc precisa de uma maneira bonita de fazer isso que vc está fazendo, correto?!?
Se funcionou, e vc sempre garante ter o ID do setor nessa inclusão (deve vir de uma combobox) não vejo nada de errado no seu código.

Se vc quizer incrementar, faça um método na sua classe que busca os setores (deveria ser um DAO espelhado de um Repository, mas vc está começando, nos perdoamos, rs) que retorne um Setor pelo seu ID… como um findById(Integer id)…

E sobre performance, ir no banco e não ir no banco… não ir sempre vai ser mais rápido… hehehe

Vamos supor que vc vai salvar um novo setor, vc vai ter que fazer um update no usuario que vc desejar, na campo Setor dele, sendo assim vc estaria fazendo um update e insert automaticamente.

mas se vc já tem o setor, e não tem a ligação dele com o usuário, vc vai ter que saber qual vc quer mesmo, aí não tem escolha, pelo que eu sei!!

rodrigoallemand, obrigado pela ajuda.

Você tá certo, eu sempre vou ter na mão o ID do setor.
Sobre fazer tipo um SetorDAO.findById(Integer id), para trazer o objeto carregado, fazendo a consulta no banco, aí sim eu acho desnecessário pro meu caso, a não ser que eu queira fazer uma validação pra ver se o setor realmente existe, mas a constraint do banco ia barrar a inclusão se não existisse :D.

Eu só estava estranhando no meu código, pq achava desnecessário instanciar um objeto do tipo Setor, só pra setar o id e carregar no Usuario, mas se tá certo então blz :smiley:

Mais uma vez obrigado pela ajuda cara…!

ThiagoWorldCoder,

tá aí uma outra dúvida, se eu quisesse ao invés de incluir o usuário com o setor existente, eu quisesse incluir tb um novo setor?
pensei em algo da seguinte forma:

Setor setor = new Setor();
setor.setNome("Tecnologia da Informação");

Usuario usuario = new Usuario();
usuario.setLogin("felipempantoja");
usuario.setSetor(setor);

session.save(usuario);

Com certeza vai dar erro por falta do id do setor, mas deve ter um jeito de incluir dados em duas tabelas +ou- dessa forma.

Sabe como fazer?

Descobri aqui.

pra salvar ou atualizar os objetos associados (no meu caso, Setor) ao objeto principal (no meu caso, Usuario) basta incluir uma propriedade no Usuario.hbm.xml na tag do relacionamento deles:

aqui comigo ficou assim:

<many-to-one name="setor" class="Setor" fetch="select" cascade="save-update"> <column name="setor_id" not-null="true" /> </many-to-one>

Obrigado pela ajuda pessoal.
Daqui a pouco apareço com novas dúvidas…rs