Автоинкремент Derby и Eclipselink UnitOfWork - PullRequest
5 голосов
/ 24 ноября 2011

Кажется, что проблема между столбцом Eclipslink и Derby Auto-Icrement, когда я вставляю значение через 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();

Вот сгенерированный Eclipselink SQL:

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;

Решение - использовать «Entity Manager» вместо «Unit of Work». Похоже, что UnitOfWork не поддерживает автоинкрементные столбцы Derby.

Я не собираюсь принимать свое собственное решение, поскольку оно не является прямым решением для UnitOfWork. Может быть, у кого-то есть такая же проблема, и я хочу выяснить, является ли это ОШИБКОЙ UnitOfWork или просто плохо документирована.

1 Ответ

1 голос
/ 28 ноября 2011

Использование собственного API-интерфейса EclipseLink (UnitOfWork) должно работать так же, как JPA, в отношении Derby и сгенерированных идентификаторов. Убедитесь, что вы объявили поле как использующее секвенирование в своем дескрипторе, и установите для вашей платформы значение Derby и установите нативную последовательность.

...