0

私は奇妙な問題を抱えています。JPA アプリケーションでテーブル生成戦略を使用しています。最近まで、JPA 実装として Toplink 永続化プロバイダーを使用していました。すべてうまくいきました。ちょうど今、TopLink でサポートされていないいくつかの継承機能 (クラス継承ごとのテーブル) を追加したので、EclipseLink に移行する必要がありました。ID生成を除いて、すべて正常に動作します。すべての一意の ID に使用するコード例を次に示します。

@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 の場合、ログ出力はどうなりますか?

4

2 に答える 2

0

解決策が見つかりました。それがより多くの人々に役立つことを願っています: 何らかの理由で、永続化ユニットに次の永続化構成設定を設定しました。

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

どうやら EclipseLink で ID 検証をオフにすると、ID 生成もオフになります。

助けようとしたすべての人に感謝します!

于 2012-11-13T16:18:41.203 に答える
0

ログでエラーを確認し、どの SQL が失敗しているかを確認します。

テーブル定義には、他にいくつかの列がありますか?

USER_ID はJPAに伝えたものではなく、nullでもないため、失敗する可能性があると思います。

それでも問題が解決しない場合は、さらに多くの詳細を含めてください。

于 2012-11-05T15:06:36.983 に答える