Wir verwenden Hibernate als JPA-Provider und wir haben eine Klasse mit einem großen Objektfeld markiert mitorg.hibernate.type.TextType und Oracle
@Lob
@Type(type = "org.hibernate.type.TextType")
private String someString;
Die Säule als
SOMESTRING LONG()
erstellt
Dies funktioniert einwandfrei mit PostgreSQL und MySQL. Mit Oracle, wenn das Objekt
entityManager.persist(object);
beibehalten wird, erhalten wir eine org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Ausnahme.
die @Type(type = "org.hibernate.type.TextType")
Anmerkung Das Entfernen wird das Problem mit Oracle lösen, sondern führt eine Codierung Problem mit PostgreSQL beschrieben, wie in Cannot store Euro-sign into LOB String property with Hibernate/PostgreSQL
Ich mag würde wissen, wie ein großes Textfeld zu definieren, so dass out-Programm sowohl PostgreSQL arbeitet und Orakel. Eine reine JPA-Lösung wäre optimal, aber auch eine Hibernate-spezifische Lösung.
Edit:
Die wirkliche Ausnahme:
java.sql.BatchUpdateException: ORA-22295: cannot bind more than 4000 bytes data to LOB and LONG columns in 1 statement
Nun ist die Ausnahme, die ich verpasst erklärt das Problem und in der Tat das Objekt ich persistierenden bin mehr als dann die große Zeichenfolge (mindestens eine lange DBID).
Batch-Update konnte nicht ausgeführt werden, bedeutet nur, dass beim Übernehmen der Updates ein Fehler aufgetreten ist. Normalerweise gibt es eine konkretere Fehlermeldung in der Stack-Trace. Bitte posten Sie den kompletten Stack-Trace. – Johanna
Nur um sicher zu gehen, dass ich dem Problem folge. Das Entfernen von '@ Type' (was ist die beabsichtigte richtige Lösung hier übrigens) ist problematisch wegen der nicht verstaatlichten Charakterunterstützung? Aka, mit Clob anstelle von NClob? –
@SteveEbersole Ja, aber ich merke erst jetzt, dass das Entfernen der '@ Type' Annotation keine Auswirkung auf PostgreSQL hat (in beiden Fällen wird eine TEXT-Spalte erstellt). – Matteo