oracle上的hibernate序列@GeneratedValue(strategy = GenerationType.AUTO)
问题内容:
我使用@GeneratedValue(strategy = GenerationType.AUTO)
在我的实体上生成ID。
我现在不知道它是如何工作的,但是在我的子表上,它会生成遵循父序列的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)
;
问题答案:
这些注释不会创建两个序列,而只会创建一个。这是正确/预期的吗?
这是预期的行为。使用时@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
。对许多人来说就足够了。
现在,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;