我使用 @GenerateValue(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。这对很多人来说就足够了。
现在,可以使用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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)