2012-03-26 16 views
2

我有一個實體類,其主鍵上有以下注釋:@GeneratedValue(strategy = GenerationType.AUTO)。然而,當我嘗試persist這個類的一個實例,我得到OpenJPA 1 - 未創建序列表

com.microsoft.sqlserver.jdbc.SQLServerException:無效的對象名稱OPENJPA_SEQUENCE_TABLE「。 在com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)

表它是尋找絕對在數據庫中不存在。它連接到數據庫的用戶可以創建表。它是否應該自動創建OPENJPA_SEQUENCE_TABLE,還是我必須這樣做?如果是這樣,它期望的表格模式是什麼?我使用的是openjpa-1.2.2.jar。

編輯:我看着main()'s JavaDoc因爲它有一個選項添加命令行上的順序表,但org.apache.openjpa.jdbc.schema.TableJDBCSequence在OpenJPA-1.2.2.jar不存在。 org.apache.openjpa.jdbc.schema確實,但TableJDBCSequence不在其中。

回答

5

默認情況下,除非在persistence.xml中啓用了SynchronizeMappings屬性,否則OpenJPA不會自動創建任何表(包括序列表)。然而,這真的只是爲了調試的目的很好,因爲我覺得每一個應用程序啓動時重置數據庫:

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 

您也可以使用OpenJPA中的MappingTool通過命令行來生成模式腳本:

java org.apache.openjpa.jdbc.meta.MappingTool -action buildSchema -foreignKeys true 

有關映射工具和運行時轉發映射的更多信息,請訪問:http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_mapping.html#ref_guide_ddl_examples

您最終的選擇是僅手動創建表。這是Oracle的腳本;你也許可以將它轉換爲SQL Server的相當容易:

CREATE TABLE openjpa_sequence_table (ID tinyint(4) NOT NULL, SEQUENCE_VALUE bigint(20) default NULL, PRIMARY KEY (ID)) 
+1

這是一個無效的Oracle DDL。 Oracle不支持TINYINT或BIGINT,只有NUMBER。 CREATE TABLE openjpa_sequence_table(ID NUMBER(4)NOT NULL,SEQUENCE_VALUE NUMBER(20)default NULL,PRIMARY KEY(ID)); – 2013-10-16 13:27:57

0

在我的情況下改變GenerationType.AUTO到GenerationType.IDENTITY解決了這個問題。當然這只是一個解決方案,如果你可以改變實體。