There's seems a problem between Eclipslink and Derby Auto-Icrement column when i insert value via 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();
Here's the SQL Eclipselink generated:
INSERT INTO APP.SYS_USER (DB_ID, CREATED, STATUS, USER_NAME, USER_PASSWORD) VALUES (?, ?, ?, ?, ?) bind => [0, null, null, testinsert, test]
Result in an "Attempt to modify an identity column 'DB_ID'." Exception.
Here's the SQL i want it generated:
INSERT INTO APP.SYS_USER (USER_NAME, USER_PASSWORD) VALUES ( ?, ?) bind => [testinsert, test]
I've tried INSERT INTO SYS_USER(USER_NAME, USER_PASSWORD) VALUES('tesetinsert2', 'test') and this works well.
Is there a map file xml or something solve this problem or can I config Derby to skip those null value?
EDIT:here's the table:
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:here's the part of Entity:
@Table(name = "SYS_USER")
@Entity
public class SysUser implements Serializable {
@Column(name = "DB_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private int dbId;
The solution is use "Entity Manager" instead of "Unit of Work". It seems that UnitOfWork do not support Derby's Auto-increment columns.
I'm not going to accept my own solution for it is not a direct solution with UnitOfWork. There may be someone have this same problem and I want to find out whether this is a BUG of UnitOfWork or just poor documented.