2012-11-04 41 views
0

我有一個奇怪的問題。 我在我的JPA應用程序中使用表生成策略。直到最近,我使用Toplink持久性提供者作爲JPA實現。一切正常。 剛纔我添加了TopLink(Table per Class Inheritance)不支持的一些繼承特性,所以我不得不轉移到EclipseLink。 所有的工作都很好,除了ID生成。 下面是我用我所有的唯一ID代碼示例:@TableGenerator不能使用EclipseLink JPA 2.0

@Id 
@TableGenerator(name="INCOME_SEQ", table="SEQUENCE_TABLE", pkColumnName="SEQUENCE_NAME", 
    valueColumnName="SEQUENCE_COUNT", pkColumnValue="INCOME_SEQ", allocationSize=1) 
@GeneratedValue(strategy=GenerationType.TABLE, generator="INCOME_SEQ") 
@Column(name = "INCOME_ID") 
private Integer incomeId; 

完全相同的代碼工作與Toplink的,但不與工作的EclipseLink。 我得到的錯誤是:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'INCOME_ID' cannot be null 
Error Code: 1048 

這似乎是表代在所有未使用...

這裏是我的MySQL數據庫的表說明:表 名稱:SEQUENCE_TABLE

+----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+----------------+--------------+------+-----+---------+-------+ 
| SEQUENCE_NAME | varchar(64) | NO | PRI | NULL |  | 
| SEQUENCE_COUNT | int(11)  | NO |  | 0  |  | 
| localized_name | varchar(128) | YES |  | NULL |  | 
| USER_ID  | int(11)  | NO | MUL | 1  |  | 
+----------------+--------------+------+-----+---------+-------+ 

任何人都可以請直接給我的問題?或者至少有一種方法來獲得ID未被創建的實際原因?

編輯:這是收入階層和表結構:

+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 
| Field     | Type                   | Null | Key | Default | Extra | 
+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 
| INCOME_ID    | int(11)                  | NO | PRI | NULL |  | 
| REFERENCE_DOCUMENT_ID | varchar(32)                 | YES |  | NULL |  | 
| CLIENT_ID    | int(9)                  | NO | MUL | NULL |  | 
| income_date    | datetime                  | NO |  | NULL |  | 
| MOVEMENT_CATEGORY_ID | int(11)                  | NO | MUL | NULL |  | 
| SUM_AFTER_TAX   | decimal(10,2)                 | YES |  | 0.00 |  | 
| TOTAL_SUM    | decimal(10,2)                 | NO |  | NULL |  | 
| TAX_SUM     | decimal(10,2)                 | NO |  | 0.00 |  | 
| VAT_PERCENT    | decimal(10,2)                 | NO |  | NULL |  | 
| DESCRIPTION    | varchar(100)                 | YES |  | NULL |  | 
| STATUS     | smallint(5) unsigned               | YES |  | 0  |  | 
| REFERENCE_DOCUMENT_TYPE | enum('MANUAL_INVOICE','MANUAL_RECEIPT','INVOICE','RECEIPT','INVOICE_RECEIPT') | YES |  | NULL |  | 
| USER_ID     | int(11)                  | NO | MUL | 1  |  | 
| UNIQUE_USER_SEQUENCE | int(10) unsigned                | YES |  | NULL |  | 
+-------------------------+-------------------------------------------------------------------------------+------+-----+---------+-------+ 

編輯:我跑了的EclipseLink日誌記錄級別的應用程序設置爲最優秀的,但我還是看不出什麼錯。我甚至可以看到測序被正確初始化:

[EL Finest]: 2012-11-07 20:37:00.359--ServerSession(1832413009)--Connection(1484802679)--Thread(Thread[pool-1-thread-2,5,main])--Connection released to connection pool [default]. 
[EL Finest]: 2012-11-07 20:37:00.405--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequencing connected, state is NoPreallocation_State 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence SEQ_GEN_IDENTITY: preallocation size 1 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequencing connected, state is Preallocation_Transaction_NoAccessor_State 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence RECEIPTS_SEQ: preallocation size 1 
[EL Finest]: 2012-11-07 20:37:00.406--ServerSession(1832413009)--Thread(Thread[pool-1-thread-2,5,main])--sequence INCOME_SEQ: preallocation size 1 

    [EL Finest]: 2012-11-07 20:38:09.264--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--persist() operation called on: 555 וובה. 
[EL Finer]: 2012-11-07 20:38:09.265--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--begin unit of work commit 
[EL Finest]: 2012-11-07 20:38:09.288--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--Execute query DoesExistQuery(referenceClass=MovementCategories) 
[EL Finest]: 2012-11-07 20:38:09.29--UnitOfWork(514772947)--Thread(Thread[AWT-EventQueue-1,6,main])--Execute query InsertObjectQuery(חש' ידנית 555 וובה) 
[EL Finest]: 2012-11-07 20:38:09.291--ServerSession(1832413009)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--Connection acquired from connection pool [default]. 
[EL Finer]: 2012-11-07 20:38:09.291--ClientSession(2117615354)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--begin transaction 
[EL Fine]: 2012-11-07 20:38:09.293--ClientSession(2117615354)--Connection(1484802679)--Thread(Thread[AWT-EventQueue-1,6,main])--INSERT INTO income (INCOME_ID, DESCRIPTION, INCOME_DATE, REFERENCE_DOCUMENT_ID, REFERENCE_DOCUMENT_TYPE, STATUS, SUM_AFTER_TAX, TAX_SUM, TOTAL_SUM, UNIQUE_USER_SEQUENCE, VAT_PERCENT, CLIENT_ID, MOVEMENT_CATEGORY_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
    bind => [null, null, 2012-11-07 20:37:55.225, 555, MANUAL_INVOICE, 1, 100.0, 16.5, 116.5, null, 16.5, 334, 3] 

我看到的唯一的線索是Preallocation_Transaction_NoAccessor_State財產... 也許有人能幫助我理解這一點。在排序主鍵ID的情況下,日誌輸出應該是什麼?

+1

Eclipselink日誌記錄在這裏描述http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging嘗試最好的水平。 – Chris

+0

好吧,我得到了日誌輸出(感謝那個鏈接...)。 我在主要問題 – Vova

+0

中添加了結果它似乎並不像id使用排序,包括收入的完整類映射,還檢查是否有orm.xml覆蓋註釋,並確保您正確編譯和部署你的代碼。 – James

回答

0

檢查日誌中的錯誤以及SQL失敗的原因。

在你的表def中,你有幾個其他的列?

USER_ID不是你告訴JPA的內容,也不是null,所以我認爲可能會導致失敗。

如果仍有問題,請包含更多詳細信息。

+0

我包含的錯誤片段顯示SQL錯誤告訴當插入數據時,income_id的主鍵列是NULL。 user_id列默認爲'1',所以不定義它不是問題,它只是默認爲'1'。我應該提到,當我使用Toplink作爲JPA提供程序時,完全相同的代碼(使用完全相同的數據庫)完美地工作。 至於更多日誌記錄 - 你知道嗎我如何能夠提取更詳細的EclipseLink日誌? – Vova

+1

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging – James

0

找到了解決辦法,希望這將是有益的一些人: 出於某種原因,我有以下的持久性配置設置集爲我的堅持單位:

persistenceMap.put(PersistenceUnitProperties.ID_VALIDATION,"NONE"); 

中的EclipseLink顯然關閉ID驗證還關閉ID生成。

感謝所有試圖幫助的人!