سؤال

لدي الحالة التالية:

@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;
  ....
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top