Будьте в спящем режиме последовательность на оракуле, @GeneratedValue (стратегия = GenerationType. АВТОМАТИЧЕСКИЙ)

Я - usign @GeneratedValue (стратегия = GenerationType. АВТОМАТИЧЕСКИЙ) для генерации идентификатора на моем объекте.

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

//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;
}

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

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

Я вставил свои объекты с моим сервисом ДАО только с помощью entityManager.persist(parent);

20
задан Kingfisher Phuoc 21 January 2016 в 09:07
поделиться

2 ответа

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

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

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

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

Вы можете создать отдельные последовательности для каждой таблицы, но IMHO это просто лишний код, не приносящий никакой пользы.

1
ответ дан 29 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: