Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Derby Auto-Increment and Eclipselink UnitOfWork

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.

like image 490
MikeZTM Avatar asked Nov 14 '22 14:11

MikeZTM


1 Answers

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.

like image 173
James Avatar answered Nov 16 '22 03:11

James