我使用@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值会更新序列。 在child上插入ID值,更新序列。 在下一个父项插入中,序列...使用由子插入更新的值...
这个注释,不是创建两个序列,只有一个。这是正确/预期的吗?
我只使用entityManager.persist(parent);
答案 0 :(得分:46)
这些注释不会创建两个序列,只有一个。这是正确/预期的吗?
这是预期的行为。使用@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;
答案 1 :(得分:1)
是的,这是正确的和预期的。
您可以为每个表创建单独的序列,但恕我直言,这只是额外的代码而没有实际的好处。
答案 2 :(得分:1)
@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;
}