Chúng tôi đang sử dụng một loại chú thích JPA trông như thế này (mã groovy):Làm cách nào để di chuyển chuỗi PostgreSQL thành một loại văn bản?
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
Khi nó lần đầu tiên được viết Tôi rất mới để JPA và viết SQL đầu tiên, sau đó thực hiện các lớp chú thích phù hợp với SQL. Đọc lên trên PostgreSQL nó có vẻ như sau là bảng tôi muốn:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
này làm việc, và chúng tôi đã có bảng trông như thế này:
id | text
-----+------------------------
837 | really long text here
Những gì tôi muốn làm bây giờ là đúng sự JPA Entity trông như thế này:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
Bằng cách thêm chú thích @Lob
nhà cung cấp JPA (trong trường hợp của tôi, hibernate) có thể tạo ra DDL một cách chính xác đối với tôi trong trường hợp chúng tôi muốn trao đổi cơ sở dữ liệu. Nó cũng tài liệu chính xác những gì tôi muốn trường văn bản được. Bây giờ khi một ghi chú được tạo ra tôi thấy một cái gì đó như thế này:
id | text
-----+------------------------
837 | 33427
Điều gì là tốt cho ghi chú mới, khi tôi đọc nó trong mã bằng cách sử dụng String getText() nó trả về văn bản thực sự dài. Thành thật mà nói tôi không biết làm thế nào PostgreSQL thực hiện các loại text
, cũng không phải tôi cần phải về mặt lý thuyết. Tuy nhiên cơ sở dữ liệu sản xuất của chúng tôi đã có nhiều ghi chú được lưu trữ bằng mã cũ mà không có chú thích @Lob
. Chạy mã mới trên một cơ sở dữ liệu hiện có tạo ra các vấn đề như thế này:
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
Đối với ghi chú hiện có, là có một cách thức SQL để di chuyển các ghi chú cũ để sử dụng @Lob
và text
loại một cách chính xác? Cảm ơn trước.
Nếu không có chú thích đó, nhà cung cấp JPA sẽ tạo bảng có loại vARCHAR cột, đó không phải là điều tôi muốn. '@ Lob' tạo ra kiểu' văn bản' của PostgreSQL, chính xác là cái tôi muốn. Nếu tôi muốn chuyển đổi cơ sở dữ liệu, tôi muốn sử dụng nhà cung cấp JPA để tạo DDL cho tôi. '@ Lob' là cần thiết để làm điều đó. Có lý? – Joe
bạn có chắc '@ Lob' đang tạo' văn bản' không? cả tài liệu và đầu ra đã đăng của bạn khiến tôi nghĩ rằng nó sẽ tạo ra 'oid' — đó là cách Postgres lưu trữ các đối tượng lớn. nếu nó thực sự là 'văn bản', bạn sẽ chỉ thấy _text_, không phải là một số bí ẩn. – Eevee
Tôi tích cực, đây là bảng mà nó xuất ra với chú thích '@ Lob': [gist] (https://gist.github.com/4630173) – Joe