Wir haben eine PPV kommentierte Art verwenden, die so (groovy Code) sieht:Wie migriere ich PostgreSQL-Zeichenfolgen in einen Texttyp?
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
Als es zuerst die SQL erste machte ich war geschrieben wurde sehr neu in JPA und schrieb, dann sind die kommentierten Klassen die passen SQL. Lesen auf PostgreSQL schien es wie folgt aus der Tisch war ich wollte:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
Das funktionierte, und wir hatten Tische, die wie folgt aussah:
id | text
-----+------------------------
837 | really long text here
Was will ich jetzt zu tun ist, korrekt die JPA Entity zu sehen wie folgt aus:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
Durch das Hinzufügen der @Lob
Anmerkung der JPA-Provider (in meinem Fall, hibernate) könnte die DDL richtig für mich, falls erzeugen Wir wollen Datenbanken austauschen. Es dokumentiert auch genau, was ich will, dass das Textfeld ist. Nun, wenn eine Notiz erstellt wird, ich sehe etwas wie folgt aus:
id | text
-----+------------------------
837 | 33427
, die für neue Noten in Ordnung ist, als wenn ich es in Code String getText lesen() es gibt den wirklich langen Text. Ehrlich gesagt weiß ich nicht, wie PostgreSQL den text
Typ implementiert, noch sollte ich in der Theorie brauchen. In unserer Produktionsdatenbank sind jedoch bereits viele Notizen mit altem Code ohne die @Lob
Annotation gespeichert. Das Ausführen des neuen Code auf einer vorhandenen Datenbank erzeugt Fragen wie diese:
org.springframework.dao.DataIntegrityViolationException: Bad value for type long : not a number this time; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Bad value for type long : not a number this time
Für bestehende Notizen, gibt es eine Möglichkeit in SQL die alten Noten zu migrieren @Lob
und text
Typ korrekt zu benutzen? Danke im Voraus.
Ohne diese Anmerkung würden die JPA-Provider eine Tabelle mit Spaltentyp varchar erzeugen, das nicht das, was ich will. '@ Lob' erzeugt den PostgreSQL' text' Typ, was genau das ist, was ich will. Wenn ich Datenbanken wechseln wollte, würde ich den JPA-Provider verwenden, um die DDL für mich zu generieren. '@ Lob' ist notwendig, um dies zu tun. Sinn ergeben? – Joe
Sind Sie sicher, '@ Lob' erzeugt' text'? Sowohl die Dokumentation als auch die von Ihnen gepostete Ausgabe lassen mich denken, dass sie "oid" generieren würde - so speichert Postgres große Objekte. Wenn es wirklich "Text" wäre, würden Sie nur _text_ sehen, keine Mystery-Nummer. – Eevee
Ich bin positiv, hier ist die Tabelle, die es mit der '@ Lob' Annotation ausgibt: [gist] (https://gist.github.com/4630173) – Joe