gpt4 book ai didi

java - Derby 自动增量和 Eclipselink UnitOfWork

转载 作者:搜寻专家 更新时间:2023-11-01 00:52:27 25 4
gpt4 key购买 nike

当我通过 UnitOfWork 插入值时,Eclipslink 和 Derby Auto-Icrement 列之间似乎有问题。

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 以跳过那些空值吗?

编辑:这是表格:

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" ) );

编辑:这是实体的一部分:

@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 还是文档不完整。

最佳答案

在 Derby 和生成的 ID 方面,使用 EclipseLink native API (UnitOfWork) 应该与 JPA 的工作方式相同。确保在描述符中将该字段声明为使用排序并将平台设置为 Derby 并设置 native 排序。

关于java - Derby 自动增量和 Eclipselink UnitOfWork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com