2011-11-24 12 views
5

UnitOfWorkを使用して値を挿入すると、EclipslinkとDerby Auto-Icrementの列に問題があるようです。ここでDerby自動インクリメントとEclipselink UnitOfWork

SessionFactory sessionFactory = new SessionFactory("default"); 
Session session = sessionFactory.getSharedSession(); 
UnitOfWork uow = session.acquireUnitOfWork(); 
SysUser usr2 = new SysUser(); 
usr2.setUserName("test"); 
usr2.setUserPassword("test"); 
uow.registerObject(usr2); 
uow.commit(); 

は、SQLのEclipseLinkが発生したのです: "ID列 'DB_ID' を変更しようとする"

INSERT INTO APP.SYS_USER (DB_ID, CREATED, STATUS, USER_NAME, USER_PASSWORD) VALUES (?, ?, ?, ?, ?) bind => [0, null, null, testinsert, test] 

の検索結果を中例外。

は、ここで私はそれが生成するSQLです:私はINSERT INTO SYS_USER(USER_NAME, USER_PASSWORD) VALUES('tesetinsert2', 'test')を試してみた

INSERT INTO APP.SYS_USER (USER_NAME, USER_PASSWORD) VALUES (?, ?) bind => [testinsert, test] 

、これはうまく機能します。

マップファイルxmlなどがこの問題を解決しているのですか、それらのヌル値をスキップするようにDerbyを設定できますか?

EDITは:

CREATE TABLE SYS_USER ( 
    "DB_ID" INTEGER NOT NULL DEFAULT AUTOINCREMENT: start 1 increment 1 , 
    "USER_NAME" VARCHAR(64) NOT NULL , 
    "USER_PASSWORD" VARCHAR(64) NOT NULL , 
    "STATUS" VARCHAR(64) DEFAULT 'ACTIVE' , 
    "CREATED" TIMESTAMP DEFAULT current_timestamp 
    , CONSTRAINT "SQL110614114038650" PRIMARY KEY ("DB_ID")); 

EDIT

@Table(name = "SYS_USER") 
@Entity 
public class SysUser implements Serializable { 
    @Column(name = "DB_ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Id 
    private int dbId; 

ソリューションは、仕事の "エンティティマネージャ" ではなく」の単位を使用している:ここでは、エンティティの一部だ、ここでテーブルです" UnitOfWorkはDerbyの自動インクリメント列をサポートしていないようです。

私はUnitOfWorkの直接的な解決策ではないため、私自身の解決策を受け入れるつもりはありません。誰かがこの同じ問題を抱えている可能性があり、これがUnitOfWorkのバグであるのか、それとも文書化されていないのかを知りたいのです。

答えて

1

EclipseLinkのネイティブAPI(UnitOfWork)を使用すると、Derbyおよび生成されたIDに関してJPAと同じように機能するはずです。記述子でシーケンスを使用してフィールドを宣言し、プラットフォームをDerbyに設定し、ネイティブ・シーケンスを設定してください。