Estou com problema em criar um relacionamento 1:1 unidirecional no hibernate.
A regra é esta, um usuário só pode ter um status, mas um status pode ter vários usuários.
Como ficaria o meu hbm de usuário?
Tente algo assim:
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-declaration-manytoone
Blz, funcionou…
Mas eu gostaria de entender um pouco melhor.
Eu tenho 3 tabelas Usuario, TipoUsuario e Status. Um usuario tem só um tipo e um status e um tipo tem vários usuários e um status tem vários usuários e um tipo só tem um status.
E eu fiz assim no hbm do TipoUsuário:
<one-to-one name="status" class="test.Status" constrained="true"/>
E tive que fazer desta maneira no Usuário:
<many-to-one name="status" class="test.Status" column="id_status"></many-to-one>
Por que teve esta diferença de um hbm para outro se a regra era a mesma? Um usuário só pode ter um status e um tipoUsuário só pode ter um status.
E Desde já agradeço a ajuda de todos.
Veja bem…
<one-to-one name="status" class="test.Status" constrained="true"/>
Um Tipo de Usuário tem um e somente um status…
Por isso um relacionamento um-para-um de TipoUsuário-Status…
Agora ao contrário:
<many-to-one name="status" class="test.Status" column="id_status"></many-to-one>
Muitos usuários tem o mesmo status…
Por isso o relacionamento de muitos-para-um
Deu para sacar?
Mas eu to vendo um pequeno problema de normalização aqui…
Se você tem uma tabela TipoUsuário que está ligado com a tabela Status, porque a tabela Usuário não está ligado com TipoUsuário e sim com Status?
Acho que há uma redudância de dados que está dificultando um pouco o entendimento aí…
O relacionameto deveria ser: Usuario - TipoUsuario - Status e não Status - Usuário - TipoUsuario - Status(again)
Abraços…
A modelagem está assim porque o operador do sistema poderia tirar um usuario do sistema e também poderia tirar um tipo de usuário também, que ai tiraria todos os usuários ligados a um tipo.
Mas este sistema não está sendo usado mais…
Voltando a pergunta anterior, eu não entendi muito bem.
Você falou:
Isso também não se aplicaria a um usuário?
Um usuário tem um e somente um status?
[quote=Jedi_FeniX]
…
Você falou:
Isso também não se aplicaria a um usuário?
Um usuário tem um e somente um status?[/quote]
Não…
Vários usuários tem o mesmo status… Você pode ter 5 usuários com Status “Admin”, 2 usuários com o status “Operador”, 1 usuário com o status “Coisarada”…
pense assim: Se você fizer um select na tabela Status, buscando os usuários de determinado status, irá retornar 1 ou muitos usuários?!
select u.* from usuarios u, status s where s.descStatus like 'Admin';
Agora, se você fizer o mesmo com a tabela tipoUsuario
select tu.* from tipo_usuario tp, status s where s.descStatus like 'Admin';
O retorno será somente 1 tipo_usuário…
Agora ficou mais claro, valeu!
Aproveitando, eu gostaria de usar o tópico para tirar outras dúvidas.
No momento estou com esta, tenho uma procedure no PostgreSQL, toda vez que vou inserir um usuário eu uso esta procedure.
A procedure ela já calcula qual será o próximo id e ve se o usuário já existe.
Eu vi que eu posso colocar no aquivo hbm assim:
<sql-insert>SELECT set_user(null, ?, ?, ?);</sql-insert>
Mas toda vez que eu tento inserir um usuário dá erro.
Como o hibernate sabe qual são os campos da procedure?
Por exemplo o primeiro parâmetro da procedure é o id do usuário, se for nulo a procedure insere um usuário e for setado ela faz um update, como posso passar esta regra para o hibernate?