我們使用JPA註釋類型看起來像這樣(Groovy代碼):如何將PostgreSQL字符串遷移到文本類型?
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
當它第一次寫我是很新的JPA和寫的SQL第一,遂作出上述註釋類匹配SQL。 PostgreSQL的讀了它好像下面是我想要的表:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
這個工作,我們有一個看起來像這樣的表:
id | text
-----+------------------------
837 | really long text here
我想現在要做的是正確的JPA實體,看起來像這樣:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
通過添加@Lob
註釋JPA提供者(在我的情況下,休眠)能夠在正確的情況下產生的DDL我我們想換出數據庫。它也準確地記錄了我想要的文本字段。現在,當音符越創建我看到這樣的事情:
id | text
-----+------------------------
837 | 33427
這是精細新音符,當我在代碼中使用字符串的getText(閱讀),它返回的很長的文字。老實說,我不知道PostgreSQL如何實現text
類型,理論上也不需要。然而,我們的生產數據庫已經有很多使用舊代碼存儲的註釋,而沒有@Lob
註釋。運行現有數據庫的新代碼產生的問題是這樣的:
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
對於現有的筆記,有沒有在SQL的方式遷移舊鈔正確使用@Lob
和text
類型?提前致謝。
如果沒有這個註釋,JPA提供者會產生與列varchar類型的表,這不是我想要的。 '@ Lob'生成PostgreSQL'text'類型,這正是我想要的。如果我想切換數據庫,我想使用JPA提供程序爲我生成DDL。爲了做到這一點,'@ Lob'是必要的。合理? – Joe
你確定'@ Lob'正在生成'text'嗎?文檔和發佈的輸出都讓我認爲它會生成'oid' - 這就是Postgres如何存儲大型對象。如果它真的是「文本」,你只會看到_text_,而不是一個神祕的數字。 – Eevee
我很積極,這裏是它用'@ Lob'註釋輸出的表格: [gist](https://gist.github.com/4630173) – Joe