2009-08-26 14 views
2

Wenn ich eine Legacy-Datenbank ohne referentielle Integrität oder Schlüssel habe und gespeicherte Prozeduren für alle externen Zugriffe verwendet, gibt es keinen Sinn, nHibernate zu verwenden, um Entitäten (Objektgraphen) persistent zu machen?Kann ich nHibernate mit einer Legacy-Datenbank ohne referentielle Integrität verwenden?

Plus, die SP nicht nur CRUD-Operationen, sondern Business-Logik als auch enthalten ...

Ich beginne mit einem benutzerdefinierten ado.net DAL zu denken kleben würde :(

Prost leichter

Ollie

+0

Keine Primärschlüssel entweder? –

+0

Keine Schlüssel, keine Indizes, keine Identitätsspalten, keine Fremdschlüsseleinschränkungen - so ziemlich eine der schlechtesten Legacy-DBs, die ich seit einiger Zeit gesehen habe, und ich möchte nichts in der DB ändern, aus Angst, etwas zu kaputt zu machen Weiß nicht oder habe die Kontrolle über ... :) – AwkwardCoder

Antwort

1

Sie höchstwahrscheinlich CAN. Aber man sollte wohl nicht :-)

Hibernate kümmert sich nicht um die referenzielle Integrität an sich. Während es offensichtlich eine Art von Verknüpfung zwischen zugeordneten Tabellen benötigt, ist es egal, ob eine tatsächliche FK-Bedingung existiert. Wenn zum Beispiel Product als many-to-one zu Vendor gemappt wird, sollte PRODUCTS Tabelle eine Art von VENDOR_ID drin haben, aber es muss kein FK sein.

Abhängig von Ihren SP-Signaturen können Sie diese möglicherweise nicht als benutzerdefinierte CRUD in Ihren Mappings verwenden. Wenn SPs tatsächlich eine Geschäftslogik enthalten, die bei allen CRUD-Operationen angewendet wird, könnte dies Ihr erstes potenzielles Problem sein.

Schließlich, wenn Ihr SPs in der Tat für ALLE CRUD-Operationen verwendet werden (einschließlich aller möglichen Abfragen) es ist wahrscheinlich es einfach nicht wert, zu versuchen und Hibernate auf die Mischung vorstellen - man so ziemlich nichts gewinnen und du wirst habe noch eine weitere Ebene zu bewältigen.

0

in Ordnung, ein Beispiel für das Problem ist folgende:

A SP verwendet eine SQL-Anweisung ähnlich wie die im Anschluss an die nächste Id wählen in die ‚Id‘ Spalte einer Tabelle eingefügt werden (diese Spalte ist nur eine int-Spalte aber keine Identitätsspalte),

Anweisung: 'wählt @cus_id = max (id) + 1 von Kunden,

so einmal die nächste ID berechnet wird es in Tabelle A mit anderen Daten eingefügt werden Dann wird eine Zeile in Tabelle B eingefügt, in der Tabelle A (keine Fremdschlüsseleinschränkung) für eine andere Spalte aus Tabelle A angegeben ist. Anschließend wird eine Zeile eingefügt d in Tabelle C mit dem gleichen Verweis auf Tabelle A.

Wenn ich dies in NH unter Verwendung der fließenden NH zugeordnet die Karte erzeugt eine korrekte 'einfügen' SQL-Anweisung für die erste Tabelle, aber wenn die zweite Tabelle wurde als ' Reference 'eine' update 'sql-Anweisung wurde generiert, ich hatte erwartet, eine' einfügen 'Anweisung zu sehen ...

Jetzt ist die Tatsache, dass es keine Identitätsspalten, keine Schlüssel und keine referentielle Integrität bedeutet für mich, dass ich kann ‚t Garantie Beziehung sind eins-zu-eins, eins-zu-viele etc ...

Wenn das wahr ist, wie kann NH (fließend) entweder konfiguriert ...

Prost

Ollie

+0

Sie scheinen db Constraints/ID-Generierung mit Hibernate-Mappings zu verwirren. Sie müssen _DO_ in Hibernate zugeordnete IDs haben; Sie müssen sich jedoch nicht auf die Identity-Spalte verlassen (Sie können beispielsweise Generatoren "zugewiesen" oder "Inkrement" verwenden), und Hibernate kümmert sich nicht um PK/FK-Einschränkungen. Das heißt, die Auswahl von max (id), wie Sie unten gezeigt haben, ist höchst problematisch, es sei denn, Sie können Reihenfolge der Ausführung garantieren (Sie sind verpflichtet, ID-Kollisionen von gleichzeitigen Transaktionen früher oder später zu bekommen) – ChssPly76

+0

Ich bin mir bewusst des Problems der Verwendung von 'Select max (id)'. Wie für die Verwirrung auf NH, ich weiß, dass Sie Generatoren für Identity-Spalten "zugewiesen" oder "Inkrement" angeben können. Was mich verwirrt, ist die Tatsache, dass im Allgemeinen (von den Dokumenten) geraten wird, "Referenzen" anstelle von "HasOne" zu verwenden, und die Tatsache, wenn ich das tue, warum generiert sie 'update' Anweisungen statt 'insert' Anweisungen für die Tabelle, die sich auf die ursprüngliche Einfügung beziehen – AwkwardCoder

+0

Ich bin ein Hibernate-Benutzer, daher könnte die Terminologie hier ein wenig unverbunden sein. "HasOne" bedeutet Embedded/Component? Das würde auf die gleiche Tabelle abgebildet werden und ist daher hier nicht relevant. Mögliche Gründe, warum Hibernate ein Update anstelle von Einfügung ausgeben könnte, sind (a) Ihre Zuordnungszuordnung ist falsch; oder (b) IDs auf B/C-Entitäten werden falsch zugeordnet, was dazu führt, dass Hibernate annimmt, dass die Entität bereits existiert (dies passiert häufig bei "zugewiesenen" Generatoren). – ChssPly76