Precisa de um exemplo de um mapeamento @OneToOne de chave primária no Hibernate
-
10-07-2019 - |
Pergunta
Pode alguém por favor me dar um exemplo de um @OneToOne mapeamento primário-chave unidirecional em hibernação? Eu tentei inúmeras combinações, e até agora a melhor coisa que eu comecei é o seguinte:
@Entity
@Table(name = "paper_cheque_stop_metadata")
@org.hibernate.annotations.Entity(mutable = false)
public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {
private static final long serialVersionUID = 1L;
@Id
@JoinColumn(name = "paper_cheque_id")
@OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class)
private PaperCheque paperCheque;
}
Sempre que Hibernate tenta gerar automaticamente o esquema para o mapeamento acima, ele tenta criar a chave primária como uma bolha, em vez de como um longo, que é o tipo de ID da PaperCheque. Alguém pode me ajudar por favor ? Se eu não puder obter uma solução exata, algo próximo faria, mas eu apreciaria qualquer resposta.
Solução
A sua intenção é ter uma relação 1-1 entre PaperChequeStopMetaData e PaperCheque? Se é assim, você não pode definir a instância PaperCheque como o @ ID de PaperChequeStopMetaData, você tem que definir uma coluna @ ID separado no PaperChequeStopMetaData.
Outras dicas
esta discussão quando eu implementado um par de mapeamentos @OneToOne , espero que possa ser de utilidade para você também, mas nós não deixe Hibernate criar o banco de dados para nós.
Observe a anotação GenericGenerator.
De qualquer forma, eu tenho esse trabalho código:
@Entity
@Table(name = "message")
public class Message implements java.io.Serializable
{
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "message_id")
public MessageContent getMessageContent()
{
return messageContent;
}
}
@Entity
@Table(name = "message_content")
@GenericGenerator(name = "MessageContent", strategy = "foreign",
parameters =
{
@org.hibernate.annotations.Parameter
(
name = "property", value = "message"
)
}
)
public class MessageContent implements java.io.Serializable
{
@Id
@Column(name = "message_id", unique = true, nullable = false)
// See http://forum.hibernate.org/viewtopic.php?p=2381079
@GeneratedValue(generator = "MessageContent")
public Integer getMessageId()
{
return this.messageId;
}
}
Obrigado a ambos por suas respostas. Eu continuei a experimentar, e aqui está o que eu tenho de trabalho:
@Entity
@Table(name = "paper_cheque_stop_metadata")
@org.hibernate.annotations.Entity(mutable = false)
public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
@Id
@Column(name = "paper_cheque_id")
@AccessType("property")
private long id;
@OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class)
@PrimaryKeyJoinColumn(name = "paper_cheque_id")
@JoinColumn(name = "paper_cheque_id", insertable = true)
@NotNull
private PaperCheque paperCheque;
@XmlAttribute(namespace = XMLNS, name = "paper-cheque-id", required = true)
public final long getId() {
return this.paperCheque.getId();
}
public final void setId(long id) {
//this.id = id;
//NOOP, this is essentially a pseudo-property
}
}
Este é, por todos os meios, um nojento truque, mas isso me deixa tudo que eu queria. Os assessores da propriedade paperCheque são como normal (não mostrado). Eu executar para esse tipo de unidirecional problema mapeamento OneToOne antes e resolvido por soluções muito piores, mas desta vez eu decidi que eu estava indo para descobrir para fora, e assim eu continuei a mexer com ele. Mais uma vez, obrigado a ambos por suas respostas, é muito apreciada.
Apenas atualizando esta questão para exibições futuras.
Quando essa pergunta foi feita eu acho que não havia uma solução adequada para este problema. Mas desde JPA 2.0 você pode usar @MapsId para resolver este problema.
Referência com a explicação correta: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/
Você deve ficar longe de mapeamento OneToOne de hibernação, é muito perigoso. consulte http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128
você é melhor fora de usar mapeamentos ManyToOne.