我使用@GeneratedValue(strategy = GenerationType.AUTO)在我的实体上生成ID。
@GeneratedValue(strategy = GenerationType.AUTO)
我现在不知道它是如何工作的,但是在我的子表上,它会生成遵循父序列的ID值。
//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值将更新序列。在子级上插入的ID值将更新序列。在下一个父项插入中,序列…使用由子项插入更新的值…
此注释不会创建两个序列,而只会创建一个。这是正确/预期的吗?
我仅使用插入了具有DAO服务的实体 entityManager.persist(parent);
entityManager.persist(parent)
这些注释不会创建两个序列,而只会创建一个。这是正确/预期的吗?
这是预期的行为。使用时@GeneratedValue(strategy = GenerationType.AUTO),JPA提供程序将为特定数据库选择适当的策略。对于Oracle,这将是SEQUENCE,并且由于您未指定任何内容,因此Hibernate将使用名为的单个全局序列hibernate_sequence。
@GeneratedValue(strategy = GenerationType.AUTO)
hibernate_sequence
这样对吗?好吧,我不知道,这取决于您的需求。以防万一,Oracle序列的默认最大值是1E + 27,或1,000,000,000,000,000,000,000,000,000,000,000。对许多人来说就足够了。
1E + 27
1,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;