GenerationType.AUTO vs GenerationType.Идентичность в спящем режиме

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

@Generated Value(strategy = GenerationType.IDENTITY)

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

2 ответов


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

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

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


цитирую Java настойчивость / идентичность и последовательность:

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

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

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

пример :

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