Ich habe einige Probleme bei der Zuordnung eines Byte-Arrays zu einer MySQL-Datenbank in Hibernate und frage mich, ob ich etwas fehlt, was offensichtlich ist Meine Klasse sieht ungefähr so aus. Die Tabelle ist so definiert in MySQL 5 5.Und die Hibernate 3 6 2 Mapping sieht Ähnlich wie. Ich benutze hbm2ddl nur für die Validierung und es gibt mir diesen Fehler, wenn ich die Anwendung bereitstellen. Wenn mit Typ Binär in der Zuordnung würde nicht Hibernate zu erwarten, dass die Spalte s Typ binär statt Tinyblob bin, ich don t Wissen, was würde ich verbrauchen einige Zeit Googeln dies aber konnte nicht finden, die genaue Fehler Die Lösungen für ähnliche Fehler waren. Specify Länge auf der Eigenschaft Das ändert sich, was Typ Hibernate erwartet, aber es ist immer eine Vielzahl von Blob statt der binären Typ es s Finden stattdessen einen Typ auf dem Eigenschaftenelement zu deklarieren, ein Spaltelement zu verschachteln und ihm ein sql-type Attribut zu geben, das funktioniert aber das würde auch die verbindliche spezifisch für MySQL machen, also würde ich es gern vermeiden, wenn möglich Abou T dieses Setup, das diese Mismatch verursachen würde Wenn ich den Typ Binär anstelle von Blob angeben, warum ist Hibernate erwartet einen Blob statt einer binary. asked 12. Mai 11 um 5 28.Sie sind korrekt - Typ binary ist definitiv das Problem war ich nur falsch Angenommen, da es sowohl einen Blob-Hibernate-Typ als auch einen binären Hibernate-Typ gibt, würde der Blob-Hibernate-Typ den verschiedenen MySQL-Blob-Typen entsprechen und die Binärdatei würde dem Binär entsprechen. Es scheint leider kein Hibernate-Typ zu sein, der einem MySQL entspricht Binär, die wie eine ziemlich große Aufsicht spaaarky21 scheint. Mai 15 11 at 17 04.Was wir am Ende tun, um ein Problem ähnlich wie dies zu lösen ist unsere eigene benutzerdefinierte UserType. UserTypes sind relativ einfach zu implementieren Erstellen Sie einfach eine Klasse, die implementiert und implementiert Die Override-Methoden in Ihren Hibernate-Definitionen, mit einem User-Typ ist ziemlich einfach. Simply put, Was dies tun wird, ist diese Klasse zum Lesen und Schreiben der Daten aus der Datenbank Speziell die Meth Ods nullSafeGet und nullSafeSet werden verwendet. In unserem Fall haben wir diese verwendet, um die Binärdaten zu komprimieren, bevor wir sie in die Datenbank schreiben und sie als Auslesen dekomprimieren. Dies verbirgt die Tatsache, dass die Daten aus der Anwendung mit diesen Daten komprimiert werden Habe eine Anwendung mit Hibernate 3 1 und JPA Annotationen Es hat ein paar Objekte mit Byte Attribute 1k - 200k in Größe Es nutzt die JPA Lob Annotation und Hibernate 3 1 kann diese gut auf allen großen Datenbanken zu lesen - es scheint zu verbergen JDBC Blob Vendor Besonderheiten, wie es tun sollte. Wir mussten auf 3 5 zu aktualisieren, als wir entdeckten, dass Hibernate 3 5 Pausen und gewann t fix diese Annotation Kombination in postgresql ohne Workaround Ich habe nicht eine klare Fix so weit gefunden, aber ich tat Beachten Sie, dass, wenn ich nur die Lob entfernen, verwendet es die Postgresql Typ Bytea, die funktioniert, aber nur auf postgres. Ich bin auf der Suche nach einem Weg, um eine einzige kommentierte Klasse mit einer Blob-Eigenschaft, die tragbar ist über große Datenbanken. Was ist das tragbare Weg, um ein Byt zu kommentieren E property. Is ist in einer neuen Version von hibernate. Update behoben Nach dem Lesen dieses Blogs habe ich endlich herausgefunden, was die ursprüngliche Problemumgehung in der JIRA-Frage war Anscheinend sollen Sie Lob fallen und annotieren die Eigenschaft als. However, dies nicht Arbeite für mich - ich bekomme immer noch OIDs anstelle von Bytea hat es aber für den Autor der JIRA-Ausgabe gearbeitet, die scheinen zu wollen oid. Nach der Antwort von A Garcia, habe ich dann versucht diese Combo, die eigentlich auf postgresql arbeitet, Aber nicht auf oracle. Was ich wirklich tun muss, ist zu kontrollieren, welche die Kombination Lob-Byte auf postgresql abgebildet ist. Hier ist das Snippet aus MaterializedBlobType sql Typ Blob Laut Steve s Blog, postgresql möchte, dass du Streams für Bytea don t benutzt Frage mich warum und postgresql s benutzerdefinierte Blob-Typ für Oids Beachten Sie auch, dass mit setBytes auf JDBC ist auch für Bytea aus vergangener Erfahrung Also das erklärt, warum use-Streams hat keinen Einfluss sie beide übernehmen Bytea. This Ergebnisse in. Update Die nächste logische Frage ist Warum Nicht nur ändern Sie die Tabellendefinitionen manuell zu Bytea und halten Sie die Lob-Byte Dies funktioniert Arbeit, BIS Sie versuchen, ein Null-Byte speichern, die der PostgreSQL-Treiber denkt, ist ein OID-Typ Ausdruck und der Spaltentyp ist Bytea - das ist, weil Hibernate richtig anruft Anstatt von denen PG-Fahrer erwartet. Typ-System in Hibernate ist derzeit ein work in progress nach 3 5 5 deprecation Kommentar In der Tat so viel von der 3 5 5-Code ist veraltet, ist es schwer zu wissen, was zu sehen, wenn Sub - Klassifizierung der PostgreSQLDialect. AFAKT, auf postgresql sollte auf eine benutzerdefinierte Art, die OID-Stil JDBC-Zugriff verwendet, dh PostgresqlBlobType-Objekt und NOT MaterializedBlobType Ich habe nie wirklich erfolgreich verwendet Blobs mit postgresql, aber ich weiß, dass Bytea einfach nur funktioniert, wie ich würde Ich bin derzeit auf die BatchUpdateException - es ist möglich, dass der Fahrer nicht unterstützt Batching. Großes Zitat aus 2004 Um zusammenzufassen mein Geschwafel, ich d sagen, wir sollten auf den JDBC-Treiber warten t O LOBs richtig machen, bevor du Hibernate änderst. Was ist der tragbare Weg, um eine Byte-Eigenschaft zu kommentieren. Es hängt davon ab, was du willst, dass JPA ein nicht annotiertes Byte aus der JPA 2 0 spec.11 1 6 Basic Annotation bestehen kann. Die Basis-Annotation ist die Einfachste Art der Zuordnung zu einer Datenbankspalte Die Basis-Annotation kann auf eine persistente Eigenschaft oder Instanzvariable eines beliebigen der folgenden Typen angewendet werden Java-Primitiv, Typen, Wrapper der primitiven Typen, Byte-Byte-Zeichen Charakter-Enums und jede andere Art, die implementiert wird Serialisierbar Wie in Abschnitt 2 8 beschrieben, ist die Verwendung der Basis-Annotation für persistente Felder und Eigenschaften dieser Typen optional. Wenn die Basis-Annotation für ein solches Feld oder eine Eigenschaft nicht angegeben ist, gelten die Standardwerte der Basis-Annotation. Und Hibernate Wird es standardmäßig einem SQL VARBINARY oder einem SQL LONGVARBINARY abhängig von der Spaltengröße zuordnen, die PostgreSQL mit einem Byte behandelt. Wenn Sie das Byte in einem großen Objekt speichern möchten, sollten Sie es verwenden Ein Lob aus der Spezifikation.11 1 24 Lob Annotation. A Lob Annotation gibt an, dass eine persistente Eigenschaft oder ein Feld als ein großes Objekt an einem datenbankgestützten großen Objekttyp beharrt werden sollte. Portable Anwendungen sollten die Lob-Annotation verwenden, wenn sie sich einer Datenbank Lob zuordnen Typ Die Lob-Annotation kann in Verbindung mit der Basis-Annotation oder mit der ElementCollection-Annotation verwendet werden, wenn der Element-Sammelwert vom Basistyp ist. Ein Lob kann entweder ein Binär - oder Zeichen-Typ sein. Der Lob-Typ wird aus dem Typ des persistenten Feldes abgeleitet Eigenschaft und, außer für String und Zeichentypen, Defaults auf Blob. And Hibernate wird es zu einem SQL-BLOB, dass PostgreSQL behandelt mit einem oid. Is ist in einer neuen Version von Hibernate. Well, das Problem ist, dass ich nicht wissen, Was das Problem genau ist Aber ich kann zumindest sagen, dass sich seit 3 5 0-Beta-2 nichts geändert hat, wo ein veränderter wurde in der 3 5 x Zweig eingeführt. Aber mein Verständnis von Themen wie HHH-4876 HHH-4617 ein Nd von PostgreSQL und BLOBs, die im Javadoc des PostgreSQLDialect erwähnt werden, ist, dass du die folgende Eigenschaft setzen solltest. Wenn du oid dh Byte mit Lob verwenden willst, das ist mein Verständnis seit VARBINARY ist nicht das, was du mit Oracle willst. Versuchst du das?.Eine Alternative, HHH-4876 schlägt vor, den veralteten PrimitiveByteArrayBlobType zu verwenden, um das alte Verhalten vor Hibernate 3 zu erhalten 5.JPA 2 0 Specification. Section 2 8 Mapping Defaults für Non-Relationship Fields oder Properties. Section 11 1 6 Basic Annotation. Section 11 1 24 Lob Annotation. Justin Allerdings, während Hibernate 3 5 Karten zu oid standardmäßig liest es mit JDBC getBytes, die PGSQL-Treiber liefert die 6 Byte oid statt der Daten - tritt dies bei der Verwendung zu gehen, um zu überprüfen, was Steve sagte jetzt Pascal Thivent Sep 17 10 bei 21 37.Hier geht was O reilly Enterprise JavaBeans, 3 0 sagt. JDBC hat spezielle Typen für diese sehr großen Objekte Der Typ stellt Binärdaten dar und repräsentiert Zeichendaten. Hier geht PostgreSQLDialect Quellcode. So was du tun kannst. Override PostgreSQLDialect wie folgt. Jetzt definieren Sie einfach Ihre benutzerdefinierten Dialekt. Und verwenden Sie Ihre portable JPA Lob Annotation. Hier wurde hier extrahiert. Ich habe eine Anwendung läuft in Hibernate 3 3 2 und die Anwendungen funktioniert gut mit allen Blob-Felder mit OID-Byte in java. Migrating to Hibernate 3 5 alle Blob-Felder funktionieren nicht mehr und das Server-Log zeigt ERROR-ERROR Spalte ist vom Typ oid aber Ausdruck ist vom Typ Bytea. This generaly ist nicht Bug in PG JDBC aber Änderung der Standard-Implementierung von Hibernate in 3 5 versi On In meiner Situation Einstellung kompatiblen Eigentum auf Verbindung nicht geholfen. Mehr mehr das, was ich sah in 3 5 - Beta 2, und ich weiß nicht, ob dies behoben wurde Hibernate - ohne Typ Annotation - wird automatisch erstellen Spalte von Typ oid , Aber wird versuchen, dies zu lesen, wie Bytea. Interesting ist, weil, wenn er als Bytea klickt Siehe CustomPostgreSQLDialect Er get. Could nicht ausführen JDBC Batch-Update. Wenn Einfügen oder Aktualisieren. Hibernate - Mapping-Dateien. An Objekt relationalen Mappings sind in der Regel in einem XML definiert Document Diese Mapping-Datei weist Hibernate an, wie man die definierten Klassen oder Klassen den Datenbanktabellen zuordnen kann. Obwohl viele Hibernate-Benutzer das XML von Hand schreiben, gibt es eine Reihe von Tools, um das Mapping-Dokument zu erzeugen. Dazu gehören XDoclet, Middlegen und AndroMDA für Fortgeschrittene Hibernate users. Let uns betrachten unsere vorher definierte POJO-Klasse, deren Objekte in der im nächsten Abschnitt definierten Tabelle bestehen bleiben. Es wäre eine Tabelle, die jedem Objekt entspricht, das Sie bereit sind, persi bereitzustellen Stence Betrachten Sie objektive Objekte müssen gespeichert und in die folgende RDBMS-Tabelle abgerufen werden. Basiert auf den beiden oben genannten Entitäten können wir folgende Mapping-Datei definieren, die Hibernate anweist, wie man die definierten Klassen oder Klassen den Datenbank-Tabellen zuordnen kann. Sie sollten das Mapping-Dokument speichern In einer Datei mit dem Format classname Wir haben unser Mapping-Dokument in der Datei gespeichert. Wir sehen wenig Details über die Mapping-Elemente, die in der Mapping-Datei verwendet werden. Das Mapping-Dokument ist ein XML-Dokument mit Hibernate-Mapping als Root-Element, das die ganze Klasse enthält Elemente. Die Klassenelemente werden verwendet, um bestimmte Zuordnungen von Java-Klassen zu den Datenbanktabellen zu definieren. Der Name der Java-Klasse wird mit dem Namensattribut des Klassenelements angegeben und der Name der Datenbanktabelle wird mit dem Tabellenattribut angegeben. Das Meta-Element ist optional Element und kann verwendet werden, um die Klassenbeschreibung zu erstellen. Das ID-Element ordnet das eindeutige ID-Attribut in der Klasse dem Primärschlüssel der Datenbanktabelle zu. Der Name a Ttribute des id-Elements bezieht sich auf die Eigenschaft in der Klasse und das Spaltenattribut bezieht sich auf die Spalte in der Datenbanktabelle Das type-Attribut enthält den Hibernate-Mapping-Typ, diese Mapping-Typen werden von Java in SQL-Datentyp umwandeln. Das Generator-Element innerhalb der ID-Element wird verwendet, um automatisch die Primärschlüsselwerte zu erzeugen. Das Klassenattribut des Generator-Elements wird auf nativ gesetzt, um den Ruhezustand entweder Identität, Sequenz oder Hilo-Algorithmus aufzuheben, um den Primärschlüssel abhängig von den Fähigkeiten der zugrundeliegenden Datenbank zu erstellen Element wird verwendet, um eine Java-Klasseneigenschaft einer Spalte in der Datenbanktabelle zuzuordnen. Das Namensattribut des Elements bezieht sich auf die Eigenschaft in der Klasse und das Spaltenattribut bezieht sich auf die Spalte in der Datenbanktabelle Das Typattribut enthält den Hibernate-Mapping-Typ, Diese Mapping-Typen werden von Java in SQL-Datentyp umwandeln. Es gibt andere Attribute und Elemente, die in einem Mapping-Dokument verwendet werden und I w Sollte versuchen, so viele wie möglich zu decken, während andere Hibernate-bezogene Themen behandelt werden.5 1 Mapping-Deklaration. Object-relationale Zuordnungen werden in der Regel in einem XML-Dokument definiert Das Mapping-Dokument ist so ausgelegt, dass es lesbar und handbearbeitbar ist. Die Mapping-Sprache ist Java-centric, Was bedeutet, dass Zuordnungen um persistente Klassendeklarationen und nicht Tabellendeklarationen konstruiert werden. Bitte beachten Sie, dass, obwohl viele Hibernate-Benutzer wählen, um das XML von Hand zu schreiben, gibt es eine Anzahl von Tools, um das Mapping-Dokument zu erzeugen. Dazu gehören XDoclet, Middlegen und AndroMDA. Here ist Ein Beispiel-Mapping. Wir diskutieren nun den Inhalt des Mapping-Dokuments Wir beschreiben jedoch nur die Dokumentelemente und Attribute, die von Hibernate zur Laufzeit verwendet werden. Das Mapping-Dokument enthält auch einige zusätzliche optionale Attribute und Elemente, die die exportierten Datenbankschemata beeinflussen Durch das Schema-Export-Tool zum Beispiel das Nicht-Null-Attribut.5 1 1 Doctype. All XML-Zuordnungen sollten den Doctype s deklarieren Hown Die tatsächliche DTD kann bei der URL oben gefunden werden, im Verzeichnis hibernate-x xx src org hibernate oder in Hibernate wird immer für die DTD in seinem Klassenpfad zuerst suchen Wenn Sie Lookups der DTD mit einer Internetverbindung erleben, überprüfen Sie die DTD Deklaration gegen den Inhalt deines Klassenpfades.5 1 1 1 EntityResolver. Hibernate wird zuerst versuchen, DTDs in seinem Klassenpfad zu lösen. Dies ist die Registrierung einer benutzerdefinierten Implementierung mit dem SAXReader, den es verwendet, um in den XML-Dateien zu lesen. Dieser benutzerdefinierte EntityResolver erkennt zwei verschiedene SystemId namespaces. a Hibernate Namespace wird erkannt, wann immer der Resolver auf ein System stößt, das mit dem Resolver auftritt, versucht, diese Entitäten über den Classloader zu lösen, der die Hibernate-Klassen geladen hat. Ein User-Namespace wird erkannt, wenn der Resolver auf einem System mit einem Klassenpfad-URL-Protokoll auftritt. Der Resolver Wird versuchen, diese Entitäten über 1 den aktuellen Thread-Context-Classloader und 2 den geladenen Classloader zu lösen Die Hibernate-Klassen. Das folgende ist ein Beispiel für die Verwendung von Benutzernamenpacing. Where ist eine Ressource im Paket und enthält eine benutzerdefinierte typedef.5 1 2 Hibernate-Mapping. This Element hat mehrere optionale Attribute Die Schema und Katalogattribute spezifizieren, dass Tabellen auf In dieser Zuordnung gehören zu dem benannten Schema und oder dem Katalog Wenn sie angegeben sind, werden Tablennamen durch das angegebene Schema und die Katalognamen qualifiziert. Wenn sie fehlen, werden die Tabellamen unqualifiziert. Das Standard-Kaskadenattribut gibt an, welchen Kaskadenstil für Eigenschaften angenommen werden soll Und Sammlungen, die kein Kaskadenattribut angeben. Standardmäßig können Sie mit dem Auto-Import-Attribut unqualifizierte Klassennamen in der Query language. schema optional den Namen einer Datenbank einfügen, die den Namen der Datenbank enthält. - Standard ist der Klassenname Hibernate3 erlaubt Eine Klasse, die mehrfach abgebildet werden soll, potenziell zu verschiedenen Tabellen Es erlaubt auch Entity-Zuordnungen, die durch Maps oder XML auf der Java-Ebene I dargestellt werden In diesen Fällen sollten Sie einen expliziten beliebigen Namen für die Entität angeben. Siehe Abschnitt 4 4, Dynamische Modelle und Kapitel 18, XML-Mapping für weitere Informationen. check optional ein SQL-Ausdruck, der verwendet wird, um eine mehrzeilige Check-Einschränkung für die automatische Schemagenerierung zu generieren. Rowid optional Hibernate kann ROWIDs auf Datenbanken verwenden Auf Oracle kann z. B. Hibernate die rowid-Extraspalte für schnelle Updates verwenden, sobald diese Option auf rowid gesetzt wurde. Ein ROWID ist ein Implementierungsdetail und stellt den physischen Speicherort eines gespeicherten Tupels. subselect optional dar Karten einer unveränderlichen und schreibgeschützten Entität zu einer Datenbank subselect Dies ist nützlich, wenn Sie eine Ansicht anstelle einer Basistabelle haben möchten. Siehe unten für weitere Informationen. abstract optional wird verwendet, um abstrakte Superklassen in Union-Subclass-Hierarchien zu markieren. Es ist akzeptabel Für die benannte persistente Klasse, um eine Schnittstelle zu sein Sie können die Implementierung von Klassen dieser Schnittstelle mit dem Unterklassenelement deklarieren Sie können jede statische innere Klasse bestehen. Geben Sie die cl an Ass-Name mit dem Standard-Formular i e. Immutable Klassen, mutable false kann nicht aktualisiert oder gelöscht werden durch die Anwendung Dies ermöglicht Hibernate, einige kleinere Performance-Optimierungen. Das optionale Proxy-Attribut ermöglicht faulen Initialisierung von persistenten Instanzen der Klasse Hibernate wird zunächst CGLIB zurückgeben Proxies, die die benannte Schnittstelle implementieren Das persistente Objekt wird geladen, wenn eine Methode des Proxy aufgerufen wird Siehe Initialisierung von Sammlungen und Proxys unten. Implicit Polymorphismus bedeutet, dass Instanzen der Klasse von einer Abfrage zurückgegeben werden, die eine beliebige Superklasse oder implementierte Schnittstelle oder Klasse nennt, Und dass Instanzen einer beliebigen Unterklasse der Klasse von einer Abfrage zurückgegeben werden, die die Klasse selbst nennt Explicit polymorphism bedeutet, dass Klasseninstanzen nur von Abfragen zurückgegeben werden, die explizit diese Klasse nennen. Abfragen, die die Klasse benennen, werden nur Instanzen von Unterklassen zurückgeben, die im Inneren abgebildet sind Diese Klassendeklärung als Unterklasse oder verbundene Unterklasse Für die meisten Zwecke, th E default Polymorphismus implizit ist angemessen Explizite Polymorphie ist nützlich, wenn zwei verschiedene Klassen auf dieselbe Tabelle abgebildet werden. Dies ermöglicht eine leichte Klasse, die eine Teilmenge der Tabellenspalten enthält. Das persister-Attribut ermöglicht es Ihnen, die für die Klasse verwendete Persistenzstrategie anzupassen. Zum Beispiel, geben Sie Ihre eigene Unterklasse an oder Sie können sogar eine völlig neue Implementierung der Schnittstelle, die implementiert, zum Beispiel Persistenz über gespeicherte Prozeduraufrufe, Serialisierung zu flachen Dateien oder LDAP Siehe für ein einfaches Beispiel der Beharrlichkeit zu einem Hashtable Dynamic-update und dynamic-insert-Einstellungen werden nicht von Unterklassen übernommen, so dass sie auch auf den Unterklassen - oder Jo-Subclass-Elementen angegeben werden können. Obwohl diese Einstellungen in einigen Fällen die Leistung erhöhen können, können sie die Leistung in anderen Fällen sogar verringern. Vor-Update wird in der Regel die Leistung verringern Es ist sinnvoll, zu verhindern, dass ein Datenbank-Update-Trigger unnötig aufgerufen wird, wenn Sie reat Tach ein Diagramm der abgetrennten Instanzen zu einer Session. Wenn Sie Dynamik-Update aktivieren, haben Sie eine Auswahl von optimistischen Sperren Strategies. version überprüfen Sie die Version Zeitstempel Spalten. Alle überprüfen alle Spalten. dirty überprüfen Sie die geänderten Spalten, so dass einige gleichzeitige Updates. none Verwenden Sie keine optimistische Sperrung. Es wird dringend empfohlen, dass Sie Version Zeitstempel Spalten für optimistische Sperre mit Hibernate Diese Strategie optimiert die Leistung und ordnungsgemäß behandelt Modifikationen an freigegebenen Instanzen, dh wenn verwendet wird. Es gibt keinen Unterschied zwischen einer Ansicht und eine Basistabelle für Ein Hibernate-Mapping Dies ist auf Datenbankebene transparent, obwohl einige DBMS keine Ansichten richtig unterstützen, vor allem bei Updates Manchmal möchten Sie eine Ansicht verwenden, aber Sie können keine in der Datenbank erstellen, dh mit einem Legacy-Schema. In diesem Fall können Sie Karte eine unveränderliche und schreibgeschützte Entität zu einem gegebenen SQL-Subselect-Ausdruck. Erklären Sie die Tabellen, um diese Entität zu synchronisieren, um sicherzustellen, dass Auto-Flush passiert co Falsch und die Abfragen gegen die abgeleitete Entität geben keine veralteten Daten zurück Der Unterselekt ist sowohl als Attribut als auch als verschachteltes Mapping-Element verfügbar. Zugeordnete Klassen müssen die Primärschlüsselspalte der Datenbanktabelle deklarieren Die meisten Klassen haben auch eine Eigenschaft des JavaBeans-Stils Die eindeutige Kennung einer Instanz Das ID-Element definiert die Zuordnung von dieser Eigenschaft zum Primärschlüssel column. name optional der Name des Bezeichners property. formula optional ein SQL-Ausdruck, der den Wert für einen berechneten Fremdschlüssel definiert. Setting einen Wert der Kaskadenattribut auf irgendeinen aussagekräftigen Wert anders als keiner wird bestimmte Operationen an das zugehörige Objekt ausbreiten Die aussagekräftigen Werte werden in drei Kategorien unterteilt. Zuerst werden grundlegende Operationen, die persistieren, zusammenführen, löschen, speichern, aktualisieren, vertreiben, replizieren, , Spezielle Werte löschen-verwaisten und drittens alle kommagetrennten Kombinationen von Operationsnamen Kaskade persist, fusionieren, vertreiben oder kaskaden alle, löschen - orphan Siehe Abschnitt 10 11, Transitive Beharrlichkeit für eine vollständige Erklärung Beachten Sie, dass einzelne geschätzte, viele-zu-eins und eins-zu-eins, Assoziationen nicht verwaßen delete. Here ist ein Beispiel für eine typische Many-to-One-Deklaration Das Eigenschaft-ref-Attribut sollte nur für die Zuordnung von Altdaten verwendet werden, bei denen ein Fremdschlüssel auf einen eindeutigen Schlüssel der zugehörigen Tabelle als den Primärschlüssel verweist. Dies ist ein kompliziertes und verwirrendes relationales Modell Wenn beispielsweise die Produktklasse eine eindeutige Funktion hat Seriennummer, die nicht der Primärschlüssel ist Das eindeutige Attribut steuert die Hibernate s DDL-Generierung mit dem SchemaExport-Tool. Danach könnte die Zuordnung für OrderItem verwendet werden. Dies ist jedoch nicht gefördert. Wenn der referenzierte eindeutige Schlüssel mehrere Eigenschaften der zugehörigen Entität umfasst, Sollte die referenzierten Eigenschaften innerhalb eines benannten Eigenschaftenelements abbilden. Wenn der referenzierte eindeutige Schlüssel die Eigenschaft einer Komponente ist, können Sie einen Eigenschaftspfad angeben.5 1 13 Eins-zu-eins.5 2 1 Entitäten und Werte Der Beharrungsdienst, Java-Sprachtebenenobjekte werden in zwei Gruppen eingeteilt. Eine Einheit existiert unabhängig von anderen Objekten, die Verweise auf die Entität enthalten. Kontrastieren Sie dies mit dem üblichen Java-Modell, wobei ein nicht referenziertes Objekt Müll gesammelt ist. Entitäten müssen explizit gespeichert und gelöscht werden Saves und Deletionen können jedoch von einer übergeordneten Entität zu ihren Kindern kaskadiert werden. Dies unterscheidet sich von dem ODMG-Modell der Objektpersistenz durch Erreichbarkeit und entspricht genauer, wie Anwendungsobjekte in der Regel in großen Systemen verwendet werden. Entitäten unterstützen zirkuläre und gemeinsame Referenzen Auch versioniert werden. Ein persistenter Zustand besteht aus Verweisen auf andere Entitäten und Instanzen von Werttypen Werte sind Primitivsammlungen nicht was in einer Sammlung, Komponenten und bestimmten unveränderlichen Objekten ist Im Gegensatz zu Entitäten werden Werte in bestimmten Sammlungen und Komponenten beibehalten und gelöscht Durch Erreichbarkeit Da Wertobjekte und Primitive bestehen bleiben und d Sie können nicht unabhängig voneinander sein. Die Werte haben keine unabhängige Identität, so dass sie nicht von zwei Entitäten oder Sammlungen geteilt werden können. Bisher haben wir den Begriff persistente Klasse verwendet, um auf Entitäten zu verweisen. Wir werden das auch weiterhin tun Nicht alle benutzerdefinierten Klassen mit einem persistenten Zustand sind jedoch Entitäten Eine Komponente ist eine benutzerdefinierte Klasse mit Wert-Semantik Eine Java-Eigenschaft des Typs hat auch Wert-Semantik Angesichts dieser Definition haben alle vom JDK bereitgestellten Klassen eine Werttyp-Semantik In Java, während benutzerdefinierte Typen mit Entity - oder Value-Typ-Semantik abgebildet werden können. Diese Entscheidung liegt bei dem Anwendungsentwickler Eine Entity-Klasse in einem Domänenmodell hat normalerweise gemeinsame Verweise auf eine einzelne Instanz dieser Klasse, während Komposition oder Aggregation in der Regel Übersetzt auf einen Wert type. We werden beide Konzepte in diesem Referenzhandbuch zu überprüfen. Die Herausforderung ist, das Java-System zuzuordnen, und die Entwickler-Definition von en Tionen und Werttypen zum SQL-Datenbank-Typ-System Die Brücke zwischen beiden Systemen wird von Hibernate For Entities, Class-Subclass und so weiter verwendet. Für Wertetypen verwenden wir Property-Komponente usw., die normalerweise ein type-Attribut haben. Der Wert dieses Attributs ist Der Name eines Hibernate-Mapping-Typs Hibernate bietet eine Reihe von Zuordnungen für Standard-JDK-Werttypen aus der Box. Sie können eigene Mapping-Typen schreiben und eigene Custom-Conversion-Strategien implementieren. Mit Ausnahme von Sammlungen unterstützen alle eingebauten Hibernate-Typen Null-Semantik.5 2 2 Grundlegende Werttypen Die eingebauten Basis-Mapping-Typen können grob in die folgenden eingestuft werden. integer, long, short, float, double, character, byte, boolean, yesno, truefalse. Typ-Zuordnungen von Java-Primitiven Oder Wrapper-Klassen zu entsprechenden herstellerspezifischen SQL-Spaltentypen boolean, yesno und truefalse sind alle alternative Codierungen für ein Java boolean oder eine Typzuordnung von zu VARCHAR oder Oracle VARCHAR2.date, time, tim Estamp. Typ-Zuordnungen von und seinen Unterklassen zu den SQL-Typen DATE TIME und TIMESTAMP oder equivalent. Type-Zuordnungen von SQL-Typen TIMESTAMP und DATE oder equal. Type-Zuordnungen von und zu NUMERIC oder Oracle NUMBER. locale, timezone, currency. Type-Zuordnungen von und Zu VARCHAR oder Oracle VARCHAR2 Instanzen von Gebietsschema und Währung werden auf ihre ISO-Codes abgebildet Instanzen von TimeZone werden ihrer ID zugeordnet. Typzuordnung von VARCHAR oder Oracle VARCHAR2 Eine Klasse wird auf ihren vollqualifizierten Namen abgebildet. Maps-Byte-Arrays zu einem entsprechenden SQL-Binär-Typ. Maps lange Java-Strings zu einem SQL-CLOB oder TEXT-Typ. Maps serialisierbare Java-Typen zu einem entsprechenden SQL-Binär-Typ Sie können auch die Hibernate-Typ serialisierbar mit dem Namen einer serialisierbaren Java-Klasse oder Schnittstelle, die nicht standardmäßig ist Basic type. Type-Zuordnungen für die JDBC-Klassen und Diese Typen können für einige Anwendungen unpraktisch sein, da das Blob - oder Clob-Objekt nicht außerhalb einer Transaktion wiederverwendet werden kann. Treiberunterstützung ist patchy a Nd inconsistent. immdate, immtime, immtimestamp, immcalendar, immcalendardate, immserializable, immbinary. Type Mappings für was als mutable Java-Typen Dies ist, wo Hibernate macht bestimmte Optimierungen nur für unveränderliche Java-Typen, und die Anwendung behandelt das Objekt als unveränderlich Zum Beispiel , Sollten Sie nicht eine Instanz aufrufen, die als immtimestamp abgebildet ist. Um den Wert der Eigenschaft zu ändern und diese Änderung persistent zu machen, muss die Anwendung ein neues, nicht identisches Objekt der Eigenschaft zuweisen. Unbedingte Identifikatoren von Entitäten und Sammlungen können von jedem sein Grundtyp außer Binär-Blob und Clob Composite-Bezeichner sind auch erlaubt Siehe unten für weitere Informationen. Die Basis-Wert-Typen haben entsprechende Typ-Konstanten definiert auf Zum Beispiel stellt die Zeichenfolge Typ.5 2 3 Custom-Wert-Typen. Es ist relativ einfach für Entwickler zu Erstellen Sie ihre eigenen Werttypen Zum Beispiel möchten Sie möglicherweise Eigenschaften des Typs auf VARCHAR-Spalten bestehen Hibernate nicht vor Ea eingebauter Typ für diese benutzerdefinierten Typen sind nicht auf die Zuordnung einer Eigenschaft oder eines Auflistungselements zu einer einzelnen Tabellenspalte beschränkt. So haben Sie beispielsweise eine Java-Eigenschaft getName setName des Typs, der an den Spalten FIRSTNAME INITIAL SURNAME gehalten wird . Um einen benutzerdefinierten Typ zu implementieren, implementiere entweder oder oder deklariere Eigenschaften mit dem vollqualifizierten Klassennamen des Typs View, um die Art von Sachen zu sehen, die möglich sind. Notieren Sie die Verwendung von Spalten-Tags, um eine Eigenschaft auf mehrere Spalten zuzuordnen. Der CompositeUserType EnhancedUserType UserCollectionType Und UserVersionType-Schnittstellen bieten Unterstützung für mehr spezialisierte Anwendungen. Sie können sogar Parameter an einen UserType in der Mapping-Datei liefern Hierzu muss Ihr UserType die Schnittstelle implementieren Um Parameter an Ihren benutzerdefinierten Typ zu übergeben, können Sie das Typ-Element in Ihren Mapping-Dateien verwenden. Der UserType kann nun den Wert für den Parameter named default aus dem Eigenschaftenobjekt abrufen, das an ihn übergeben wird. Wenn Sie regelmäßig einen bestimmten UserType verwenden, ist es usef Ul, um einen kürzeren Namen zu definieren Sie können dies mit dem typedef-Element tun. Typedefs weisen einem benutzerdefinierten Typ einen Namen zu und können auch eine Liste der Standardparameterwerte enthalten, wenn der Typ parametriert ist. Es ist auch möglich, die gelieferten Parameter zu überschreiben In einem typedef auf einer Fall-zu-Fall-Basis durch die Verwendung von Typ-Parameter auf der Eigenschaft Mapping. Even obwohl Hibernate s reiche Palette von eingebauten Typen und Unterstützung für Komponenten bedeutet, dass Sie selten brauchen, um eine benutzerdefinierte Art verwenden, gilt es als gut Praxis, benutzerdefinierte Typen für Nicht-Entity-Klassen zu verwenden, die häufig in Ihrer Anwendung auftreten Zum Beispiel ist eine MonetaryAmount-Klasse ein guter Kandidat für einen CompositeUserType, obwohl es als Komponente abgebildet werden könnte. Ein Grund dafür ist die Abstraktion Mit einem benutzerdefinierten Typ, deiner Mapping-Dokumente wurden vor Änderungen an der Art und Weise, wie monetäre Werte dargestellt werden, geschützt.5 3 Mapping einer Klasse mehr als einmal. Es ist möglich, mehr als eine Zuordnung für eine bestimmte persistente Klasse zu liefern In diesem cas E, müssen Sie einen Entitätsnamen angeben, um zwischen Instanzen der beiden zugeordneten Entitäten zu disambiguieren. Standardmäßig ist der Entitätsname derselbe wie der Klassenname Hibernate können Sie den Entitätsnamen bei der Arbeit mit persistenten Objekten, beim Schreiben von Abfragen oder beim Mapping angeben Assoziationen an die benannte Entity. Associations werden nun mit Entity-Name anstelle von class.5 4 SQL-zitierte Bezeichner spezifiziert. Sie können Hibernate erzwingen, um einen Bezeichner in der generierten SQL zu zitieren, indem sie den Tabellen - oder Spaltennamen in Backticks im Mapping-Dokument Hibernate einschließen Wird die richtige Zitat-Stil für die SQL-Dialekt verwenden Dies ist in der Regel doppelte Anführungszeichen, aber der SQL Server verwendet Klammern und MySQL verwendet Backticks.5 5 Metadaten Alternativen.5 5 1 Verwenden von XDoclet markup. Many Hibernate Benutzer bevorzugen Mapping-Informationen direkt in Quellcode einbetten Mit XDoclet Wir decken diesen Ansatz in diesem Referenzhandbuch nicht ab, da es als Teil von XDoclet gilt. Allerdings schließen wir das folgende Beispiel der Cat-Klasse ein H XDoclet-Zuordnungen. Siehe die Hibernate-Website für weitere Beispiele von XDoclet und Hibernate.5 5 2 Mit JDK 5 0 Annotations. JDK 5 0 eingeführt XDoclet-Stil Annotationen auf der Sprache Ebene, die Typ-Safe und überprüft zur Kompilierzeit Dieser Mechanismus ist Leistungsstärker als XDoclet-Annotationen und besser unterstützt von Tools und IDEs IntelliJ IDEA unterstützt beispielsweise die automatische Vervollständigung und Syntax-Hervorhebung von JDK 5 0-Annotationen Die neue Revision der EJB-Spezifikation JSR-220 verwendet JDK 5 0-Annotationen als primären Metadaten-Mechanismus Für Entity-Beans Hibernate3 implementiert den EntityManager von JSR-220 die Persistenz-API Unterstützung für die Zuordnung von Metadaten ist über das Hibernate Annotations-Paket als separater Download verfügbar. Sowohl EJB3 JSR-220 als auch Hibernate3-Metadaten werden unterstützt. Dies ist ein Beispiel für eine POJO-Klasse, die als kommentiert ist Eine EJB Entity Bean. Support für JDK 5 0 Annotations und JSR-220 befindet sich derzeit in der Entwicklung Weitere Informationen finden Sie im Hibernate Annotations Modul. 5 Gen Eigenschaften, die ihre von der Datenbank erzeugten Werte haben In der Regel müssen Hibernate-Anwendungen benötigt werden, um Objekte zu aktualisieren, die alle Eigenschaften enthalten, für die die Datenbank Werte generiert. Markierung von Eigenschaften, die generiert wurden, lässt die Anwendung diese Verantwortung auf Hibernate When übertragen Hibernate gibt ein SQL-INSERT oder UPDATE für eine Entität aus, die generierte Eigenschaften definiert hat. Es wird sofort eine Auswahl ausgewählt, um die generierten Werte abzurufen. Die als generierten markierten Objekte müssen zusätzlich nicht einfügbar und nicht aktualisierbar sein. Nur Versions-Zeitstempel und einfache Eigenschaften können sein Markiert als generiert. noch der Standard wird der angegebene Eigenschaftswert nicht innerhalb der Datenbank erzeugt. insert wird der angegebene Eigenschaftswert bei Einfügen erzeugt, wird aber bei nachfolgenden Aktualisierungen nicht regeneriert Eigenschaften wie erstellt-Datum fallen in diese Kategorie Auch wenn Version und Zeitstempel-Eigenschaften Kann als generiert markiert werden, diese Option ist nicht available. always the property value is generated both on insert and on update.5 7 Auxiliary database objects. Auxiliary database objects allow for the CREATE and DROP of arbitrary database objects In conjunction with Hibernate s schema evolution tools, they have the ability to fully define a user schema within the Hibernate mapping files Although designed specifically for creating and dropping things like triggers or stored procedures, any SQL command that can be run via a method is valid for example, ALTERs, INSERTS, etc There are essentially two modes for defining auxiliary database objects. The first mode is to explicitly list the CREATE and DROP commands in the mapping file. The second mode is to supply a custom class that constructs the CREATE and DROP commands This custom class must implement the interface. Additionally, these database objects can be optionally scoped so that they only apply when certain dialects are used. Copyright 2004 Red Hat Middleware, LLC. private contents. Input Stream contents i m getting these from a file Blob b. Now when I save the Blob b, when there is a flush, it executes code that apparently is trying to convert the Blob into a byte , so I get an OutOfMemoryError Here. Java heap space at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at at. Here is the method unwrap in BlobTypeDescriptor where the exception is getting thrown. SuppressWarnings public X X unwrap Blob value, Class X type, WrapperOptions options if type type throw unknownUnwrap type. if value null return null. if type try return X new BinaryStreamImpl catch SQLException e throw new HibernateException Unable to access blob stream , e. final Blob blob value WrappedBlob value value return X blob. This is the line throwing the exception. return X new BinaryStreamImpl. It is trying to change everything into a byte , and then back into BinaryStreamImpl. Is there a way I can somehow tell hibernate not to put everything into a byte like this. I ran into the same issue OOM , and fixed it by replacing the BlobTypeDescriptor. SuppressWarnings unchecked Override public X X unwrap Blob value, Class X type, WrapperOptions options if value null return null. if type return X new BinaryStreamWrapper value. try final Blob blob value WrappedBlob value value final Blob rv return X rv catch SQLException e throw new HibernateException e. BinaryStreamWrapper implements BinaryStream and wraps around a Blob without using byte-arrays. You can register this new BlobType using an Integrator. public class BlobIntegrator implements Integrator Override public void integrate Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry BlobUserType blobUserType new BlobUserType. Another alternative is to register a UserType which overrides the nullSafeGet and nullSafeSet, but remember that you will need to handle the gory details of creating a Blob e g Oracle requires so you need to use a LobCreator Also you would need to specify the UserType for each property. Lob Type type BobUserType private Blob contents.
No comments:
Post a Comment