تحتاج مثال على تعيينOneToOne الابتدائي مفتاح في السبات

StackOverflow https://stackoverflow.com/questions/314578

سؤال

ويمكن للشخص من فضلك أعطني مثالا على رسم الخرائطOneToOne الابتدائي مفتاح أحادي الاتجاه في السبات؟ لقد حاولت العديد من المجموعات، وحتى الآن أفضل شيء لقد حصلت على هذا:

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

وعندما يحاول السبات تلقائيا بإنشاء مخطط لرسم خرائط أعلاه، فإنه يحاول إنشاء المفتاح الأساسي باعتباره النقطة، بدلا من فترة طويلة، وهو نوع معرف PaperCheque. هل من الممكن ان يساعدنى احد ما ؟ إذا كنت لا تستطيع الحصول على الحل الدقيق، وهو أمر قريب لن يفعل، ولكن أود أن نقدر أي استجابة.

هل كانت مفيدة؟

المحلول

والقصد من ذلك هو أن يكون لها علاقة 1-1 بين PaperChequeStopMetaData وPaperCheque؟ إذا كان الأمر كذلك، لا يمكنك تحديد المثال PaperCheque كماid من PaperChequeStopMetaData، لديك لتحديد عمودid منفصل في PaperChequeStopMetaData.

نصائح أخرى

هذه المناقشة عندما نفذت عدة تعييناتOneToOne ، وآمل أن تكون ذات فائدة لكم أيضا، لكننا لا تدع السبات إنشاء قاعدة البيانات بالنسبة لنا.

لاحظ الشرح GenericGenerator.

وعلى أي حال، لدي هذا العمل كود:

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

وشكرا لكل من إجاباتك. ظللت تجريب، وهنا ما حصلت العمل:

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

وهذا هو، وبكل الوسائل، الإختراق مثير للاشمئزاز، لكنه يحصل لي كل ما أردت. وaccessors الخاصية paperCheque طبيعية كما (لا يظهر). لقد واجهت هذا النوع من أحادي الاتجاه OneToOne مشكلة الخرائط قبل واستقر لحلول أسوأ من ذلك بكثير، ولكن هذه المرة قررت انني ذاهب لمعرفة، لذلك ظللت القرصنة بعيدا في ذلك. مرة أخرى، شكرا لكم على حد سواء لإجاباتك، انها محل تقدير كبير.

ومجرد تحديث هذا السؤال لوجهات النظر في المستقبل.

عند وقدم هذا السؤال أعتقد أنه لم يكن هناك حل مناسب لهذه المشكلة. ولكن منذ JPA 2.0 يمكنك استخدامMapsId لحل هذه المشكلة.

والمرجعي مع شرح الصحيح: <لأ href = "https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/" يختلط = "نوفولو noreferrer "> https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

ويجب عليك الابتعاد عن رسم الخرائط OneToOne السبات، فإنه أمر خطير جدا. يمكنك الاطلاع على http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128

وكنت أفضل حالا باستخدام تعيينات ManyToOne.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top