Hibernate: أين يمكن إدراجها = false ، updatable = false تنتمي إلى كوكب المفاتيح الأساسية المركبة التي تتضمن مفاتيح أجنبية؟

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

سؤال

عند تنفيذ المفاتيح الأولية المركبة في السبات أو غيرها ، هناك ما يصل إلى ثلاثة أماكن يمكن وضعها في إدراج = false ، قابلة للتحديث = كاذبة في الأبراج الرئيسية الرئيسية المركبة التي تستخدم علاقات تحديد (FKS التي تعد جزءًا من PK):

  1. في التعليق التوضيحي Collumn Class Class Class (embeddable فقط) أو
  2. في رابطة فئة الكيانات ' @joincolumn/s anotation أو
  3. في فئة الكيان " متكرر شرح PK Property's Column (فصول idclass فقط)

والثالث هو الطريقة الوحيدة للقيام بها مع idclass و JPA 1.0 AFAIK. نرى http://en.wikibooks.org/wiki/java_persistence/identity_and_sequencing#primary_keys_through_onetoone_relionships. سوف أفكر فقط في الحالات 1. و 2.

س: ما هي الطريقة المفضلة لوضع "إدراج = false ، قابلة للتحديث = خطأ" إلى عمومًا؟

لقد واجهت مشاكل مع السبات فيما يتعلق بهذا السؤال. على سبيل المثال ، سوف يشتكي Hibernate 3.5.x من جدول Zips

CREATE TABLE Zips
(
  country_code CHAR(2),
  code VARCHAR(10),
  PRIMARY KEY (country_code, code),
  FOREIGN KEY (country_code) REFERENCES Countries (iso_code)
)

مع:

org.hibernate.MappingException: Repeated column in mapping for entity: com.kawoolutions.bbstats.model.Zip column: country_code (should be mapped with insert="false" update="false")
org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
...

كما ترون عمود Country_Code هو PK و FK. ها هي فصولها:

فئة الكيان:

@Entity
@Table(name = "Zips")
public class Zip implements Serializable
{
    @EmbeddedId
    private ZipId id;

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code")
    private Country country = null;
...
}

فئة PK المركبة:

@Embeddable
public class ZipId implements Serializable
{
    @Column(name = "country_code", insertable = false, updatable = false)
    private String countryCode;

    @Column(name = "code")
    private String code;
...
}

عند وضع الإدراج = false ، updatable = false في جمعية فئة الكيانات ، تختفي جميع الاستثناءات وكل شيء يعمل بشكل جيد. ومع ذلك ، لا أرى لماذا لا ينبغي أن يعمل الرمز أعلاه. قد يكون السبات وجود مشاكل في هذا. هل هو علة السبات الموصوفة ، حيث لا يبدو أنها تقيم column "insertable = false ، updatable = false"؟

في جوهرها ، ما هي طريقة JPA القياسية ، أفضل الممارسات ، أو التفضيل حيث تضع "إدراج = خطأ ، قابلة للتحديث = خطأ"؟

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

المحلول

اسمحوا لي أن أجيب خطوة بخطوة.

1. متى تحتاج إلى `insertable = false ، updatable = false`؟

لنلقي نظرة على الخرائط أدناه ،

public class Zip {

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code")
    private Country country = null

    @Column(name = "country_code")
    private String countryCode;

}

نحن هنا نشير إلى نفس العمود في الجدول باستخدام خصائصين مختلفين. في الكود أدناه ،

Zip z = new Zip();

z.setCountry(getCountry("US"));
z.setCountryCode("IN");

saveZip(z);

ماذا سيفعل السبات هنا ؟؟

لمنع هذا النوع من التناقض ، يطلب منك السبات تحديد نقطة تحديث سفن العلاقة. وهو ما يعني يمكنك الرجوع إلى نفس العمود في الجدول n عدد المرات ولكن يمكن استخدام واحد منهم فقط للتحديث وسيتم قراءة جميع الآخرين فقط.

2. لماذا تشكو السبات من رسم الخرائط الخاص بك؟

في الخاص بك Zip الفصل الذي تشير إليه فئة الهوية المضمنة ZipId هذا يحتوي مرة أخرى على رمز البلد. كما في السيناريو أعلاه ، لديك الآن إمكانية تحديث counry_code عمود من مكانين. وبالتالي فإن الخطأ الذي قدمه السبات مناسب.

3. كيفية إصلاحه في حالتك؟

لا. من الناحية المثالية تريد ZipId الفصل لإنشاء المعرف ، لذلك يجب ألا تضيف insertable = false, updatable = false إلى رمز البلد داخل ZipId. لذلك الإصلاح كما يلي تعديل country رسم الخرائط في الخاص بك Zip الفصل على النحو التالي ،

@ManyToOne
@JoinColumn(name = "country_code", referencedColumnName = "iso_code",
insertable =  false, updatable = false)
private Country country;

أتمنى أن يساعد هذا فهمك.

نصائح أخرى

يمكنك أيضًا حل هذه المشكلة باستخدام @PrimaryKeyJoinColumn حاشية. ملاحظة . يحدد شرح BimicalKeyjoincolumn عمود مفتاح أساسي يستخدم كمفتاح خارجي للانضمام إلى جدول آخر.

يتم استخدام التعليق التوضيحي PrimaryKeyjoincolumn للانضمام إلى الجدول الأساسي لكيان فئة فرعية في استراتيجية رسم الخرائط المرتبطة بالجدول الأساسي للطبقة الفائقة ؛ يتم استخدامه ضمن تعليق توضيحي ثانوي للانضمام إلى جدول ثانوي إلى جدول أساسي ؛ ويمكن استخدامه في رسم خرائط OneToOne حيث يتم استخدام المفتاح الأساسي للكيان المرجعية كمفتاح خارجي للكيان المشار إليه. إذا لم يتم تحديد شرح توضيحي PrimaryKeyjoincolumn للكاسورة الفرعية في استراتيجية رسم الخرائط المرتبطة ، فمن المفترض أن يكون لأعمدة المفاتيح الخارجية نفس الأسماء مثل الأعمدة الرئيسية للمفاتيح الأساسية للجدول الأساسي للطبقة الفائقة.

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