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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top