当我通过UnitOfWork插入值时,Eclipslink和Derby自动递增列之间似乎存在问题。
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:
INSERT INTO APP.SYS_USER (DB_ID, CREATED, STATUS, USER_NAME, USER_PASSWORD) VALUES (?, ?, ?, ?, ?) bind => [0, null, null, testinsert, test]
导致"尝试修改标识列'DB_ID' "。例外。
下面是我想要生成的SQL:
INSERT INTO APP.SYS_USER (USER_NAME, USER_PASSWORD) VALUES ( ?, ?) bind => [testinsert, test]
我试过INSERT INTO SYS_USER(USER_NAME, USER_PASSWORD) VALUES('tesetinsert2', '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:这是Entity的部分:
@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的BUG还是只是文档不完善。
使用EclipseLink原生API (UnitOfWork)应该与JPA在Derby和生成的id方面工作相同。确保在描述符中声明该字段为使用排序,并将平台设置为Derby并设置本机排序。