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.
Using the EclipseLink native API (UnitOfWork) should work the same as JPA with respect to Derby and generated ids. Ensure you declared the field as using sequencing in your descriptor and set your platform to Derby and set native sequencing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With