2011-11-24 39 views
5

Có vẻ như có vấn đề giữa cột Eclipslink và Derby Auto-Icrement khi tôi chèn giá trị thông qua UnitOfWork.Derby Auto-Increment và Eclipselink 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(); 

Đây là SQL EclipseLink tạo ra: "Cố gắng để sửa đổi một cột sắc 'DB_ID"

INSERT INTO APP.SYS_USER (DB_ID, CREATED, STATUS, USER_NAME, USER_PASSWORD) VALUES (?, ?, ?, ?, ?) bind => [0, null, null, testinsert, test] 

quả trong một Ngoại lệ.

Đây là SQL tôi muốn nó được tạo ra:

INSERT INTO APP.SYS_USER (USER_NAME, USER_PASSWORD) VALUES (?, ?) bind => [testinsert, test] 

Tôi đã thử INSERT INTO SYS_USER(USER_NAME, USER_PASSWORD) VALUES('tesetinsert2', 'test') và các công trình này tốt.

Có tệp bản đồ xml hay gì đó giải quyết vấn đề này hoặc tôi có thể định cấu hình Derby để bỏ qua các giá trị null đó không?

EDIT: đây là bảng:

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: đây là một phần của Entity:

@Table(name = "SYS_USER") 
@Entity 
public class SysUser implements Serializable { 
    @Column(name = "DB_ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Id 
    private int dbId; 

Giải pháp là sử dụng "Entity Manager" thay vì "Đơn vị làm việc ". Dường như UnitOfWork không hỗ trợ các cột Auto-increment của Derby.

Tôi sẽ không chấp nhận giải pháp của riêng mình cho nó không phải là giải pháp trực tiếp với UnitOfWork. Có thể có ai đó có cùng vấn đề này và tôi muốn tìm hiểu xem đây có phải là BUG của UnitOfWork hay chỉ tài liệu kém.

Trả lời

1

Sử dụng API gốc EclipseLink (UnitOfWork) sẽ hoạt động giống như JPA liên quan đến Derby và id được tạo. Đảm bảo bạn đã khai báo trường này bằng cách sử dụng trình tự trong bộ mô tả của bạn và đặt nền tảng của bạn thành Derby và đặt trình tự gốc.