如何使用带有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!');
注意:从这里取的例子