2015-02-08 52 views
3

我有一個應用程序使用JPA(與eclipselink)。該應用程序是在後臺使用Derby數據庫開發的。這些表格由JPA自己生成。這是實體中的一個的簡單的例子:爲什麼GenerationType.AUTO不在PostgreSQL上使用串行?

public class MyEntity implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(nullable=false) 
    private String someString; 
} 

JPA然後創建另一個表SEQUENCE以生成的ID。 我們現在想要切換到PostgreSQL,而不是表SEQUENCE,我們希望在PostgreSQL中使用真實序列。這是我們用來創建表的DDL:

CREATE TABLE MYENTITY (
    ID serial PRIMARY KEY NOT NULL, 
    SOMESTRING varchar(255) NOT NULL 
) 

但還是JPA要使用SEQUENCE表(不存在):

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.   persistence.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: ERROR: relation "sequence" does not exist 
    Position: 8 
Error Code: 0 
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ? 
    bind => [2 parameters bound] 
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ? ") 

我知道,我可以改變一代戰略SEQUENCE,但我想要的代碼便攜。 GenerationType.SEQUENCE不適用於不支持序列的數據庫。我期望AUTO會在PostgreSQL上使用一個序列。爲什麼不呢?我還需要做點別的嗎?

作爲說明,似乎JPA在問題Generated Value in Postgres中自動使用了一個序列。

回答

5

如果您希望將id指定爲「in datastore」(即通過自動生成或SERIAL),您應該使用IDENTITY

同樣,如果要使用數據存儲區SEQUENCE,請選擇SEQUENCE

AUTO表示將它留給JPA實現來決定,並且它可能會決定您希望的其他內容。

相關問題