GenerationType.AUTO vs GenerationType.IDENTITY в спящем режиме

В настоящее время мы используем mysql в качестве базы данных, и мы используем

@Generated Value(strategy = GenerationType.IDENTITY)

Он отлично работает в определенной ситуации, когда нам нужно перенести нашу базу данных в Oracle в то время, когда она не работает должным образом. Если кто-нибудь знает, какая фактическая разница присутствует за этим и как она работает?

Ответ 1

Как он мог "работать правильно" (вы не определяете базовую информацию, как то, что вы подразумеваете под этим) с Oracle? Я не вижу актуальности AUTO для вашего вопроса - это просто позволяет реализации выбрать то, что она хочет использовать.

" IDENTITY " (согласно JPA javadocs и spec - то, о чем вы должны говорить) означает автоинкремент. В Oracle такой концепции нет, но в MySQL, SQLServer и некоторых других. Я бы ожидал, что любая достойная реализация JPA будет отмечать ошибку, даже когда она пытается это сделать.

Oracle могла бы использовать стратегии " SEQUENCE " или " TABLE ", однако

Ответ 2

Цитирование Java Persistence/Identity and Sequencing:

В последовательности идентификации используются специальные столбцы IDENTITY в базе данных, чтобы позволить базе данных автоматически присваивать идентификатор объекту при его вставке. Столбцы идентификаторов поддерживаются во многих базах данных, таких как MySQL, DB2, SQL Server, Sybase и Postgres. Oracle не поддерживает столбцы IDENTITY, но их можно моделировать с помощью объектов последовательности и триггеров.

поэтому я предпочитаю использовать SEQUENCE вместо этого

Объекты последовательности используют специальные объекты базы данных для генерации идентификаторов. Объекты последовательности поддерживаются только в некоторых базах данных, таких как Oracle, DB2 и Postgres. Обычно объект SEQUENCE имеет имя, INCREMENT и другие параметры объекта базы данных. Каждый раз, когда выбран.NEXTVAL, последовательность увеличивается с помощью INCREMENT.

Пример:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ")
    @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100)
    private long id;
    ...
}