Последовательность гибернации на oracle, @GeneratedValue (стратегии = GenerationType.AUTO) - PullRequest
20 голосов
/ 18 июня 2010

Я использую @GeneratedValue (стратегии = GenerationType.AUTO) для генерации идентификатора моей сущности.

Сейчас я не знаю, как это работает, но в моей дочерней таблице генерирует значения идентификаторов, которые следуют за родительской последовательностью.

//parent table
@Entity
@Table (name = "parent")
public class Parent {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn (name = "parentId")
    @ForeignKey (name = "FKparent")
    private List<child> child;

}

//child table
@Entity
@Table (name = "child")
public class Child {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;
}

Вставленные значения идентификатора на родительском элементе обновляют последовательность. Вставленные значения ID для дочернего элемента обновляют последовательность. При следующей вставке родителя последовательность ... использует значения, обновленные дочерними вставками ...

Эти аннотации не создают две последовательности, только одну. Это правильно / ожидается?

Я вставил свои сущности с помощью службы DAO, используя entityManager.persist(parent);

Ответы [ 3 ]

46 голосов
/ 18 июня 2010

Эти аннотации не создают две последовательности, только одну. Это правильно / ожидается?

Это ожидаемое поведение. При использовании @GeneratedValue(strategy = GenerationType.AUTO) поставщик JPA выберет подходящую стратегию для конкретной базы данных. В случае Oracle это будет SEQUENCE, и, поскольку вы ничего не указали, Hibernate будет использовать одну глобальную последовательность, называемую hibernate_sequence.

Это правильно? Ну, я не знаю, это зависит от ваших потребностей. На всякий случай максимальное значение по умолчанию для последовательности Oracle составляет 1E + 27 или 1 000 000 000 000 000 000 000 000 000. Этого достаточно для многих.

Теперь можно использовать GenerationType.AUTO и по-прежнему контролировать имя последовательности, когда база данных использует последовательности:

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private Long id;
1 голос
/ 03 января 2017
@Entity
@Table(name = "table_seq")
@SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1)
public class SeqEntity implements Serializable {
  private static final long serialVersionUID = 1L;

 @Id
 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE")
 private Long id;

}
1 голос
/ 18 июня 2010

Да, это правильно и ожидаемо.

Вы можете создавать отдельные последовательности для каждой таблицы, но ИМХО, это просто дополнительный код без реальной выгоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...