如何使用带有Oracle 10g方言的Hibernate使用JPA生成我的id?

我有一些代码:

@Id @SequenceGenerator(name = "SOMETHING_SEQ") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMETHING_SEQ") @Column(name = "SOMETHING", nullable = false) private Long id; 

hibernate如何提供我的身份?

我在我的数据库中看到一个名为’hibernate_sequence’的序列,没有其他hibernate’特殊表’。

实际上,这里你的SOMETHING_SEQ是你在hibernate配置中某处配置的序列的名称。 而hibernate_sequence是数据库中的序列名称。 在配置中,它看起来像下面,

  

您可以使用注释完全跳过此配置。 那么你的@SequenceGenerator注释需要提供更多的参数。 以下是示例。

 @SequenceGenerator(name="SOMETHING_SEQ", sequenceName="hibernate_sequence", allocationSize=10) 

例如,多个实体类将执行类似下面的操作,

 @Entity public class Entity1 { @Id @SequenceGenerator(name = "entity1Seq", sequenceName="ENTITY1_SEQ", allocationSize=1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity1Seq") @Column(name = "ID", nullable = false) private Long id; ... ... } @Entity public class Entity2 { @Id @SequenceGenerator(name = "entity2Seq", sequenceName="ENTITY2_SEQ", allocationSize=10) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity2Seq") @Column(name = "ID", nullable = false) private Long id; ... ... } 

hibernate如何提供我的身份?

好吧,您明确告诉JPA引擎使用SEQUENCE类型的策略自动生成标识符(使用@GeneratedValue注释),指示应该使用数据库序列来生成标识符。 如果您想知道,序列是数据库特定的对象 (例如Oracle),可用于生成唯一的整数。

我在我的数据库中看到一个名为’hibernate_sequence’的序列

您没有在@SequenceGenerator使用sequenceName注释元素来指定要使用的数据库序列对象的名称,因此Hibernate在模式生成期间创建了一个默认序列对象(默认为hibernate_sequence )。 要指定序列,请执行以下操作:

 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_seq_gen") @SequenceGenerator(name = "my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ") private Long id; 

要命名序列,您必须在@SequenceGenerator注释中设置sequenceName

 @GeneratedValue(name="gen", strategy = GeneratorType.SEQUENCE) @SequenceGenerator(name="gen", sequenceName="Sequence_Name", allocationSize = 1) @Id public Long getId() { // ... } 

值得注意的是,如果您使用的是预先存在的生成器,则allocationSize必须与该生成器的分配大小相匹配。

在Oracle中,您没有像MySQL中那样的auto_increment类型。 因此,要生成auto_increment列,您需要使用序列。

这是如何实现这一目标的一个例子。

 create table test (id number, testdata varchar2(255)); create sequence test_seq start with 1 increment by 1 nomaxvalue; create trigger test_trigger before insert on test for each row begin select test_seq.nextval into :new.id from dual; end; 

因此,在插入每一行之前创建一个序列并使用触发器来添加其id。

所以hibernate必须做这样的事情,或者不要使用触发器

 insert into test values(test_seq.nextval, 'no trigger needed!'); 

注意:从这里取的例子