مشكلة إضافة رسم خرائط manytoone على مفتاح غير أساسي في SQL Server

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

سؤال

لدي مشكلة في تغيير تطبيق Spring/Hibernate من MySQL إلى SQL Server.

عندما يقوم Hibernate بتحديث قاعدة البيانات عن طريق بدء تشغيل الخادم الذي يريد إنشاؤه (بواسطة hibernate.hbm2ddl.auto تعيين على update ) قاعدة البيانات ولكن المفتاح الأجنبي تفشل في اتباع الخطأ:

Unsuccessful: alter table table2 add constraint FKDC2DC97ECEB31922 foreign key (login) references table1
Column 'table1.id' is not the same data type as referencing column 'table2.table1_login' in foreign key 'FKDC2DC97ECEB31922'.

التعيين كما يلي:

الجدول 1:

@Id
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

الجدول 2:

@ManyToOne
@JoinColumn (name = "table1_login", referencedColumnName = "login", insertable=false, updatable=false)
public Table1 getTable1() {
    return table1;
}
public void setTable1(Table1 table1) {
    this.table1= table1;
}

++ تحرير: SQL تبدو مثل هذا:

alt text

مفاتيح من Table1:

alt text

يستخدم Table1 Table1 أيضًا من خلال تطبيق آخر ، وبالتالي يحتاج هذا الجدول إلى "معرف" العمود كمفتاح أساسي. لذلك TABLE1.ID هو المفتاح الأساسي لل TABLE1. ولكن هذا الجدول 1.ID لا يستخدم من قبل السبات ، لأن السبات يستخدم Table1.login كمعرف (انظر التعليقات التوضيحية أعلاه). ولكن لماذا يحاول SQL Server تعيين مفتاح خارجي على Table1.Id وليس إلى Table1.login؟

شكرًا

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

المحلول

إليك ما تكتبه مواصفات JPA حول Id حاشية. ملاحظة:

9.1.8 معرف التعليقات التوضيحية

يحدد شرح المعرف الخاصية أو الحقل الرئيسي للمفتاح الأساسي للكيان. يمكن تطبيق شرح المعرف في كيان أو طبقة فائقة تعيين.

بشكل افتراضي ، يُفترض أن العمود المعين للمفتاح الأساسي للكيان هو المفتاح الأساسي للجدول الأساسي. إذا كان لا Column تم تحديد التعليق التوضيحي ، ويُفترض أن اسم العمود الرئيسي الرئيسي هو اسم خاصية المفتاح الأساسي أو الحقل.

لذلك أنا أميل إلى القول إن الأمور تتصرف وفقًا للمواصفات (و login يتم تعيين العقار فعليًا على id عمودي). حاول تحديد أ Column حاشية. ملاحظة:

@Id @Column(name = "login")
public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}

لا يمكنني إعادة إنشاء Table1 لأن هذا جدول مثير. يجب أن أستخدم خيار جدول ALTER من DLL: "TABLE ALTER TABLE TABLE2 أضف قيود FK1751F2B3CEB31922 مفتاح Overide (TABLE1_LOGIN) مراجع TABLE1" وأريد النزاهة المرجعية.

للتوضيح ، إليك ما تقوله ويكيبيديا عن المفاتيح الأجنبية: يحدد المفتاح الخارجي عمودًا أو مجموعة من الأعمدة في جدول واحد (مرجع) يشير إلى مجموعة من الأعمدة في جدول آخر (مشار إليه). الأعمدة في جدول المرجع يجب أن يكون المفتاح الأساسي أو مفتاح المرشح الآخر في الجدول المشار إليه.

لذا ، في حين أنه لا يمكنك تطبيق بيان التغيير أعلاه (table1_login لا يمكن الرجوع إلى id من Table1 ، يمكنك صنع login فريدة من نوعها في Table1 وقم بإنشاء قيد FK الذي يشير إليه login. شئ مثل هذا:

ALTER TABLE table2
ADD CONSTRAINT FK_table2_table1
FOREIGN KEY (table1_login)
REFERENCES table1(login)

هذا يفترض أنك أضفت أ UNIQUE القيد على تسجيل الدخول في الجدول 1.

أنظر أيضا

نصائح أخرى

تعديل:

بعد قراءة الرسالة بعناية وجدت هذا ...

"Table1.Id" ليس هو نفس نوع البيانات مثل عمود الرجوع "Table2.table1_login"

الجدول 1.بطاقة تعريف -> Table2.Table1_Login.

معرف وتسجيل الدخول ليسا نفس نوع البيانات. لذلك هناك علاقة خاطئة PK-FK حولها ...


هذا يبدو أنك تستخدم الخطأ collation. كلا العمودين يحتاجون إلى نفس الترتيب. وإلا لا يمكنك الانضمام إليهم.

http://msdn.microsoft.com/en-us/library/aa174903(sql.80).aspx

تأكد من إزالة جميع المجموعات المصممة بشكل صريح على البرنامج النصي لإنشاء قاعدة البيانات.

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