كيفية رسم خريطة الهويات المشتقة في السبات 3؟
-
26-09-2019 - |
سؤال
لدي الحالة التالية:
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
private B b;
...
}
@Entity
class B{
@Id
private A a;
...
}
بمعنى آخر: هناك ارتباط onetoone بين A و B. B هو كيان ضعيف ، ويتم اشتقاق هويته من الفئة A.
لقد اختبرت بالفعل بعض الحلول على أنها إضافة @primarekeyjoincolumn تحت onetoone مثل هذا مقالة - سلعة يذكر. لكنني حصلت على هذا الخطأ: "org.hibernate.id.IndyfierGenerationException: يجب تعيين معرفات هذه الفئة يدويًا قبل الاتصال Save (): B"
لا أعرف ما إذا كانت ذات صلة في هذه الحالة ، لكنني أستخدم Oracle 11G.
محدث
أعتقد أنني في الطريق الصحيح. هذه هي الحالة الفعلية لمشكلتي:
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn(name="aId")
private B b;
...
}
@Entity
class B{
@Id
@OneToOne
@JoinColumn(name="aId)
private A a;
...
}
الخطأ الآن مختلف بعض الشيء:
java.sql.SQLException: ORA-00904: "B"."A": invalid identifier
إنه يحاول العثور على العمود A (بدلاً من المساعدات) في الجدول B. لا أعرف كيفية تحديد أن اسم العمود هو B.AID وليس BA
المحلول
لقد حلت مشكلتي بعد هذا حلقة الوصل
الإجابة الصحيحة ستكون:
@Entity
public class A {
@Id
@GeneratedValue
@Column(name = "aId")
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
private B b;
...
}
@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {
@Id
@GeneratedValue(generator = "a-primarykey")
@Column(name = "aId")
private Long id;
@OneToOne
@PrimaryKeyJoinColumn
private A a;
...
}
نصائح أخرى
هل جربت هذا على الكيان ب؟
@Entity class B {
@Id @OneToOne
@JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
private A a;
....
}
لا تنتمي إلى StackOverflow