2010-06-18 126 views
18

我使用@GeneratedValue(strategy = GenerationType.AUTO)在我的实体上生成ID。oracle上的休眠序列,@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值,更新序列。 对于父代的下一个插入,序列...使用由子插入更新的值...

此批注不创建两个序列,只有一个。这是正确的/预期的?

我插入我的实体吾道服务只使用entityManager.persist(parent);

回答

1

是的,这是正确的和预期。

您可以为每个表创建单独的序列,但恕我直言,这只是额外的代码没有实际的好处。

+0

若最终用户看到该密钥和由它被误导“神经质”。不要告诉我,关键需要隐藏的用户,这并不总是可能的... – Monoman 2012-02-27 18:54:35

+1

有没有办法保持ids恒定的时间和单调,没有漏洞的序列,这并不杀可扩展性。我也没有看到'jumpy'的有用定义以及为什么用户需要unjumpy ID。 – 2012-02-28 06:48:24

44

这些注释没有创建两个序列,只有一个。这是正确的/预期的?

这是预期的行为。当使用@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; 
+4

Pascal,但是如果你想使用GenerationType.AUTO来允许像MySQL这样的其他数据库使用Identity插入,这将不起作用,不是吗?因为你手动指定了一个生成器 – lujop 2013-01-11 11:21:20

0
@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; 

}