2011-11-24 15 views
5

Występuje problem między Eclipslink i kolumną Auto-Icrement Derby, gdy wstawię wartość przez UnitOfWork.Automatyczna inkrementacja Derby i 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(); 

Oto SQL EclipseLink generowane "próba modyfikacji kolumnę tożsamości 'DB_ID'"

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

skutkować Wyjątek.

Oto SQL chcę go generowane:

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

Próbowałem INSERT INTO SYS_USER(USER_NAME, USER_PASSWORD) VALUES('tesetinsert2', 'test') i to działa dobrze.

Czy istnieje plik xml mapy lub coś rozwiązać ten problem lub czy mogę skonfigurować Derby, aby pominąć te wartości null?

EDIT: oto tabela:

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: oto część jednostki:

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

Rozwiązaniem jest wykorzystanie "Entity Manager" zamiast „jednostka pracy ". Wygląda na to, że UnitOfWork nie obsługuje kolumn Auto-inkrementacji Derby.

Nie zamierzam zaakceptować własnego rozwiązania, ponieważ nie jest to bezpośrednie rozwiązanie z UnitOfWork. Być może ktoś ma ten sam problem i chcę się dowiedzieć, czy jest to BUG z UnitOfWork, czy tylko słabo udokumentowany.

Odpowiedz

1

Natywny interfejs API EclipseLink (UnitOfWork) powinien działać tak samo, jak WZP w odniesieniu do Derby i wygenerowanych identyfikatorów. Upewnij się, że zadeklarowałeś pole jako używające sekwencjonowania w deskryptorze i ustawiłeś platformę na Derby i ustawiłeś natywne sekwencjonowanie.