Почему это GenerationType.Авто не использует серийный номер на PostgreSQL?


У меня есть приложение, использующее JPA (с eclipselink). Приложение было разработано с базой данных Derby в фоновом режиме. Таблицы были сгенерированы самим JPA. Это простой пример одной из сущностей:

public class MyEntity implements Serializable {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

  @Column(nullable=false)
  private String someString;
}

JPA затем создал другую таблицу SEQUENCE для генерации идентификатора. Теперь мы хотим перейти на PostgreSQL и вместо таблицы SEQUENCE использовать реальные последовательности в PostgreSQL. Это DDL, который мы использовали для создания таблицы:

CREATE TABLE MYENTITY (
  ID serial PRIMARY KEY NOT NULL,
  SOMESTRING varchar(255) NOT NULL
)

Но все же JPA хочет использовать Таблица SEQUENCE (которая не существует):

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.          persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: relation "sequence" does not exist
    Position: 8
Error Code: 0
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ? ")
Я знаю, что могу изменить стратегию генерации на SEQUENCE, но я хочу, чтобы код был переносимым. GenerationType.SEQUENCE не следует работать с базами данных, которые не поддерживают последовательности. И я ожидаю, что AUTO будет использовать последовательность на PostgreSQL. А почему бы и нет? Мне нужно сделать что-то еще?

В качестве примечания, похоже, что JPA автоматически использовала последовательность в вопросе , генерируемом значением в Postgres.

1 4

1 ответ:

Если вы хотите, чтобы идентификатор был назначен "в хранилище данных" (то есть через автогенератор или последовательный), вы должны использовать IDENTITY.

Аналогично, если вы хотите использовать последовательность хранилища данных, выберите SEQUENCE.

AUTO значит, предоставьте это реализации JPA решать, и она может решить что-то еще, на что вы надеялись.