Frage

Kann jemand bitte geben Sie mir ein Beispiel für eine unidirektionale @OneToOne Primärschlüssel-Mapping in Hibernate? Ich habe zahlreiche Kombinationen ausprobiert, und so weit das Beste, was ich bekommen habe, ist dies:

@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;
}

Jedes Mal, wenn Hibernate versucht, automatisch das Schema für die obige Abbildung zu erzeugen, versucht es, den Primärschlüssel als Blob zu erstellen, statt als lang, die die ID Art von PaperCheque ist. Kann mir bitte jemand helfen? Wenn ich nicht eine exakte Lösung bekommen, wäre etwas in der Nähe tun, aber ich würde eine Antwort zu schätzen wissen.

War es hilfreich?

Lösung

Ihre Absicht ist es, eine 1-1 Beziehung zwischen PaperChequeStopMetaData und PaperCheque haben? Wenn das so ist, können Sie die PaperCheque Instanz als @Id von PaperChequeStopMetaData nicht definieren, müssen Sie eine separate @Id Spalte in PaperChequeStopMetaData definieren.

Andere Tipps

Ich sparte diese Diskussion wenn ich ein paar @OneToOne Mappings implementiert hoffe ich, dass es auch für Sie von nutzen sein können, aber wir lassen nicht Hibernate die Datenbank für uns erstellen.

Beachten Sie die GenericGenerator Anmerkung.

Wie auch immer, ich habe diesen Code arbeiten:

@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;
    }
}

Danke euch beiden für eure Antworten. Ich hielt das Experimentieren, und hier ist, was ich habe Arbeit:

@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
}
}

Dies ist, mit allen Mitteln, einen widerlichen Hack, aber es wird mir alles, was ich wollte. Die paperCheque Eigenschaftenaccessoren sind als normal (nicht dargestellt). Ich habe in diese Art von unidirektionalen OneToOne Mapping Problem laufen vor und für viel schlechter Lösungen angesiedelt, aber dieses Mal habe ich beschlossen, ich würde, um herauszufinden, also hielt ich Hacking es weg. Noch einmal vielen Dank auch für Ihre Antworten, ist es sehr geschätzt.

Just Aktualisierung dieser Frage für die zukünftige Aussicht.

Wenn diese Frage gestellt wurde ich denke, es gibt keine richtige Lösung für dieses Problem war. Aber da JPA 2.0 können Sie @MapsId, um dieses Problem zu lösen.

Referenz mit dem richtigen Erklärung: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

Sie sollten wegbleiben OneToOne Mapping der aus dem Ruhezustand, es ist sehr gefährlich. finden Sie unter http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128

Sie sind besser dran ManyToOne Zuordnungen verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top