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のバグであるのか、それとも文書化されていないのかを知りたいのです。