Последовательность спящего режима на оракуле, @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);
Ответы
Ответ 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;
}