Verletzung der UNIQUE KEY-Einschränkung in MS-SQL mit Hibernate beim Löschen von objecten

Die Anwendung, die wir MySQL bis heute benutzt haben und alles in Ordnung war. Jetzt müssen wir MSSQL verwenden.

Viele unserer Unit-Tests sind jetzt fehlgeschlagen. Eine Probe ist wie folgt:

Caused by: java.sql.BatchUpdateException: Violation of UNIQUE KEY constraint 'UQ__field_ty__5068257C6DE5E37D'. Cannot insert duplicate key in object 'dbo.field_type_mapping'. The duplicate key value is (<NULL>, -11). 

Wie ich schon sagte, ist dieser Test bei der Verwendung von MySQL erfolgreich.

Die Tabelle field_type_mapping hat eine Einschränkung:

 /****** Object: Index [UQ__field_ty__5068257C6DE5E37D] ALTER TABLE [dbo].[field_type_mapping] ADD UNIQUE NONCLUSTERED ( [mapping_entity_id] ASC, [field_type_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO 

Der Test ist wie folgt und die exception wird an der letzten Zeile dieses Tests geworfen:

 Invoice document = documentDao.get(5000); assertEquals("Document should have exactly one reference field!", 1, document.getFieldTypeMappings().size()); assertEquals("Document should have exactly one item!", 1, document.getDocumentItems().size()); Set<InvoiceItem> items = document.getDocumentItems(); InvoiceItem item = items.iterator().next(); assertEquals("Document's item should have no reference field!", 0, item.getFieldTypeMappings().size()); ReferenceFieldType referenceFieldType = referenceFieldTypeDao.get(-11L); FieldTypeMapping documentFieldType = new FieldTypeMapping(); documentFieldType.setFieldType(referenceFieldType); documentFieldType.setFieldValue("a value"); document.addFieldTypeMapping(documentFieldType); FieldTypeMapping documentItemFieldType = new FieldTypeMapping(); documentItemFieldType.setFieldType(referenceFieldType); documentItemFieldType.setFieldValue("another value"); item.addFieldTypeMapping(documentItemFieldType); documentDao.save(document); flush(); document = documentDao.get(id); assertEquals("Reference object for document not added!", 2, document.getFieldTypeMappings().size()); items = document.getDocumentItems(); item = items.iterator().next(); assertEquals("Reference object for document item not added!", 1, item.getFieldTypeMappings().size()); document.addFieldTypeMapping(documentFieldType); item.addFieldTypeMapping(documentItemFieldType); documentDao.save(document); flush(); document = documentDao.get(id); assertEquals("Number of reference object should not have changed for document!", 2, document.getFieldTypeMappings().size()); items = document.getDocumentItems(); item = items.iterator().next(); assertEquals("Number of reference object should not have changed for document' item!", 1, item.getFieldTypeMappings().size()); document.getFieldTypeMappings().remove(documentFieldType); item.getFieldTypeMappings().remove(documentItemFieldType); documentDao.save(document); flush(); // Exception is thrown at this point.. 

Mein Verständnis ist etwas falsch mit:

 item.getFieldTypeMappings().remove(documentItemFieldType); 

wie die exception erwähnt id -11?

Der Hibernate-Code für die Entfernung ist wie folgt:

 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH, org.hibernate.annotations.CascadeType.LOCK}) @JoinColumn(name = "mapping_entity_id") @XmlTransient @Fetch(FetchMode.SELECT) public Set<FieldTypeMapping> getFieldTypeMappings() { return fieldTypeMappings; } 

Da bin ich schön Anfänger mit diesem Ich verstehe nicht einmal, was falsch sein könnte Wie kann ich dieses Problem beheben? Ist das ein Problem mit Hibernate und wie es behandelt die Abfragen? Ich möchte auch erwähnen, dass alle db ist auch mit Hibernate erstellt, keine manuelle sql Ausführung und db Schöpfung gemacht wird.

Sie benötigen in der Regel die Möglichkeit, einen Null-FK zu haben, wenn Sie den Wert zum timepunkt der Eingabe der data nicht kennen, besonders wenn Sie andere Werte kennen, die eingegeben werden sollen.

Um Nulls in einem FK zu erlauben, ist alles, was Sie tun müssen, Nullen auf dem Feld, das die FK hat. Der Nullwert ist getrennt von der Idee, dass es ein FK ist. – das ist es, was ich glaube, dass du es tun musst.

Ob es einzigartig oder nicht einmalig ist, ob die Tabelle eine Eins-oder eine Ein-Viele-Beziehung zur übergeordneten Tabelle hat.