Como faço relacionamento one-to-one com hibernate?

Pessoal, antes que me indiquem buscar no fórum e etc, já fiz isso e não consegui resolver o problema.

Acontece que eu não estou entendendo como devo fazer o mapemamentoe como deve setar os atributos antes de salvar no BD do relacionamento em questão. Eu gostaria, de que alguem fizesse o mapemaneto simples, e duas classes que vou citar de exemplo, pra que eu consiga entender, vejam bem, preciso saber quais property ficam em quais hbm.xml e como ficaria o campo one-to-one e por ultimo, como faço no java pra implementar o set durante a execução, antes de salvar.

TAbelas do BD:
Produto:
ID
Codigo
Localizacao

Localizacao:
ID
Descricao

Classes:
Produto:
Float id
String codigo
(tipo?) localizacao

Localizacao:
Float id
(?tipo) localizacao
(Eu não sei que tipo usar na relação…)

Bem, o que quero relacionar é que cada produto tenha apenas uma localização, por favor, nao me falem pra colocar a localização na tabela de produtos, ESSE BD EH APENAS UM EXEMPLO, to forçando a barra pra facilitar pra entender o mapeamento.

Bem, agora, como ficaria o mapeamento pelo hibernate, e lembrando, toda vezque eu inserir um produto, devo inserir também uma localização única, logo após inserir o produto, como faço pra salvar isso? que campos faltam nas classes? (a respeito do mapeamento). obrigado pessoal.

vc usa annotations?

se sim, usa @OneToOne nas duas pontas do relacionamento

rissato, eu não uso annotations, eskeci de enfatizar isso, eu preciso do mapeamento em xml!

Por favor, é foda estar aprendendo, a referencia que tenho são tutoriais em ingles, e ingles não é muito meu forte, ainda hehehe

Se puder ajudar fico muito agradecido, eu nao sei nem como vou salvar depois esse relacionamento.

Eu ja tentei usando bag, mas axo que bag é desperdício em se tratando de um relacionamento one-to-one. não vou precisar de uma lista, sim um objeto, e pronto, só nao sei como fazer isso, como relacionar, que campos devem ter em cada classe, digo:
na classe Produto, devo ter os getters e setters para um campo Localizacao? ou na classe Localizacao, devo der o campo para Produto? ou ambas devem ter?

E como faço pra salvar? salvo primeiro o Produto e depois Localizacao? e como façoa “linkagem” entre eles? ah, o relacionamento não eh de PK!

[quote=pirado18]rissato, eu não uso annotations, eskeci de enfatizar isso, eu preciso do mapeamento em xml!

Por favor, é foda estar aprendendo, a referencia que tenho são tutoriais em ingles, e ingles não é muito meu forte, ainda hehehe

Se puder ajudar fico muito agradecido, eu nao sei nem como vou salvar depois esse relacionamento.

Eu ja tentei usando bag, mas axo que bag é desperdício em se tratando de um relacionamento one-to-one. não vou precisar de uma lista, sim um objeto, e pronto, só nao sei como fazer isso, como relacionar, que campos devem ter em cada classe, digo:
na classe Produto, devo ter os getters e setters para um campo Localizacao? ou na classe Localizacao, devo der o campo para Produto? ou ambas devem ter?

E como faço pra salvar? salvo primeiro o Produto e depois Localizacao? e como façoa “linkagem” entre eles? ah, o relacionamento não eh de PK![/quote]

aconselho usar annotations… não mapeio com XML, então se interessar,

Vc tem certeza que 1 localização só pode conter 1 produto ?? se sim realmente é 1 - 1 … se não… 1 - N onde uma localização pode conter varios produtos, porem o inverso não é permitido… e ate onde percebi, é pelomenos 0…1 - 1 … onde uma localização pode ter ou não um produto…

com annotation a forma seria assim

[code]public class Produto {
@Id
@GeneretedValue //conciderando que o banco de dados tem geração de chave automatica
private int id; //conciderando que o campo id é int
private String codigo;

//aqui abaixo estou relacionando 1 - 1 (@OneToOne) com localização, 

//(mappedBy = "produto")  onde esse item é mapeado por Localização através do campo produto de localização, 
//ou seja, é necessario que exista um localização, para exisitir um produto...

// "fetch = FetchType.LAZY" o fetch não é necessario so diz que ele so vai buscar na tabela a localizao, 
// caso haja chamada do field localizao (isso ocorre pq ta setado LAZY)
// isso evita que ao carregar uma lista de produto, ele já saia fazendo os devidos select para a localizao, 
// fazendo isso apenas quando há a chamada deste

// "cascade" vc pode usar CascadeType.ALL que inclui tanto Persist como Marge como Remove além do refresh
// isso vai faze com que o quando vc salve um produto, ele salve tb a localição...
// como CascadeType.REMOVE esta ai, lembre-se que quando vc apagar um produto, a localização vai pro espaço
// se não quisar isso, tire o remove...
@OneToOne(mappedBy = "produto", fetch = FetchType.LAZY, cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
private Localizacao localizacao;

//... método getters n setters

}[/code]

[code]public class Localizacao {
@Id
Float id
String codigo
@OneToOne(fetch = FetchType.LAZY, cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
private Produto produto;

//... método getters n setters

}[/code]

da pra fazer isso com XML tb… mas eu não sei como fazer, vc pode pesquisar, visto que agora vc ja tem os annotations correspondentes aos XML que vc quer mapear… espero ter ajudado

Como não sei ainda mapear em XML, eu tb prefiro usar annotations. Pra ese seu caso é mais fácil e vc ganha tempo.