Подтвердить что ты не робот

Последовательность спящего режима на оракуле, @GeneratedValue (стратегия = GenerationType.AUTO)

Я использую @GeneratedValue (strategy = 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;
}

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

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

Я вставил свои объекты с помощью моей службы DAO только с помощью entityManager.persist(parent);

4b9b3361

Ответ 1

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

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

Это правильно? Ну, я не знаю, это зависит от ваших потребностей. На всякий случай максимальное значение по умолчанию для последовательности Oracle равно 1E + 27 или 1 000 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;

Ответ 2

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

Вы можете создавать отдельные последовательности для каждой таблицы, но IMHO - просто дополнительный код без фактической выгоды.

Ответ 3

@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;

}