Mapeamento one-to-one com annotations

Salve Javeiros !!!

Tenho um relacionamento One-To-One de Pergunta e Resposta.

public class Pergunta {
	
	@Id
	@GeneratedValue
	private Long Id;

	private String descricao;
      //getter and Setters
}

public class Resposta {
	
	@Id
	@GeneratedValue
	private Long Id;	

	@OneToOne
	private Pergunta pergunta;	

	private String descricao;         
       //getter and Setters

}

Após mapear as classes e pedir para o Hibernate gerar o banco . Funciono corretamente. Ele cria as tabelas a abaixo

Pergunta(id,descricao)
Resposta(id,descricao,id_pergunta)

Agora estou montando uma carga de dados com SQL para popular direto no banco.

Quando eu vou inserir no banco respostas antes de pergunta, não consigo (OK está funcionando)

Agora quando eu vou inserir uma mais de uma resposta, com mesmo id de pergunta o banco deixa persistir

Por exemplo:

id1 pergunta1
id2 pergunta2

id1 resposta1 pergunta_id1
id2 resposta2 pergunta_id1

Eu quero inserir uma somente uma resposta para uma pergunta

id1 pergunta1
id2 pergunta2

id1 resposta1 pergunta_id1
id2 resposta2 pergunta_id2

Olá pabloleary,
No seu caso o mapemento one to one, você vai precisar criar uma chave composta para não premitir mais de uma resposta para a mesma pergunta…
Sendo o id da pergunta + o da resposta…

Fallow

Isso é bem facíl de entender, basta que você dê uma olhada nas tabelas criadas pelo Hibernate no banco:

Pergunta(id,descricao) 
Resposta(id,descricao,id_pergunta) 

Como você pode ver a tabela Resposta possui chave estrangeira para Pergunta mas o inverso não é verdade. Essa estrutura é exatamente a mesma estrutura que você iria obter se o seu relacionamento N:1 ou 1:N. O relacionamento 1:1 só existe no código a estrutura de banco de dados é será sempre de um relacionamento 1:N ou N:1.

Boa tarde pabloleary,

Rapaz é o seguinte, configure a sua chave extrangeira FK para ser UNIQUE. Então, para cada pergunta poderá haver apenas uma resposta. Entendeu?

Se não me engano vc terá que escrever “unique=true”. Faz o teste e avisa nóis!

Eu não testei, mas tente isso:


public class Pergunta {
	
	@Id
	@GeneratedValue
	private Long Id;

	@OneToOne
        @JoinColumn(name = "id", unique = true)
	private Resposta resposta;        
        
        @Column
	private String descricao;
      //getter and Setters
}

public class Resposta {
	
	@Id
	@GeneratedValue
	private Long Id;	

	@OneToOne
        @JoinColumn(name = "id", unique = true)
	private Pergunta pergunta;	

        @Column
	private String descricao;         
       //getter and Setters

}