Почему это 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 ответ:
Если вы хотите, чтобы идентификатор был назначен "в хранилище данных" (то есть через автогенератор или последовательный), вы должны использовать
Аналогично, если вы хотите использовать последовательность хранилища данных, выберитеIDENTITY
.SEQUENCE
.
AUTO
значит, предоставьте это реализации JPA решать, и она может решить что-то еще, на что вы надеялись.