Java 如何使用Hibernate和Oracle 10g方言通过JPA生成我的id?
我有一些代码:Java 如何使用Hibernate和Oracle 10g方言通过JPA生成我的id?,java,hibernate,orm,jpa,oracle10g,Java,Hibernate,Orm,Jpa,Oracle10g,我有一些代码: @Id @SequenceGenerator(name = "SOMETHING_SEQ") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMETHING_SEQ") @Column(name = "SOMETHING", nullable = false) private Long id; hibernate如何提供我的id 我在数据库中看到一个名为“hibernate\u sequenc
@Id
@SequenceGenerator(name = "SOMETHING_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMETHING_SEQ")
@Column(name = "SOMETHING", nullable = false)
private Long id;
hibernate如何提供我的id
我在数据库中看到一个名为“hibernate\u sequence”的序列,没有其他hibernate“特殊表”。在Oracle中,您没有MySQL中的自动增量类型。因此,要生成自动增量列,需要使用序列 这是一个如何实现这一目标的示例
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!');
注意:示例取自实际上,这里您的
SOMETHING_SEQ
是您在hibernate配置中某处配置的序列名称。而hibernate\u sequence
是数据库中的序列名。在配置中,它看起来如下所示
<sequence-generator name="SOMETHING_SEQ"
sequence-name="hibernate_sequence"
allocation-size="<any_number_value>"/>
@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;
...
...
}
例如,多个实体类将执行如下操作:
<sequence-generator name="SOMETHING_SEQ"
sequence-name="hibernate_sequence"
allocation-size="<any_number_value>"/>
@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;
...
...
}
要命名序列,必须在
@SequenceGenerator
注释中设置sequenceName
:
@GeneratedValue(name="gen", strategy = GeneratorType.SEQUENCE)
@SequenceGenerator(name="gen", sequenceName="Sequence_Name", allocationSize = 1)
@Id
public Long getId()
{
// ...
}
请注意,如果您使用的是预先存在的生成器,则您的allocationSize
必须与该生成器的分配大小匹配
hibernate如何提供我的id
好的,您明确告诉JPA引擎使用类型为SEQUENCE
的策略自动生成标识符(使用@GeneratedValue
注释),该策略指示应使用数据库序列生成标识符。如果您想知道,序列是特定于数据库的对象(例如Oracle),可以用来生成唯一的整数
我在数据库中看到一个名为“hibernate_sequence”的序列
您没有在@SequenceGenerator
中使用sequenceName
注释元素来指定要使用的数据库序列对象的名称,因此Hibernate在架构生成期间创建了一个默认序列对象(默认为Hibernate\u sequence
)。要指定序列,请执行以下操作:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_seq_gen")
@SequenceGenerator(name = "my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private Long id;
谢谢但在我的例子中,hibernate是如何提供我的id的?当我用一个空值为长id保存实体时,它神奇地自动插入。是通过一些特殊的表格,还是使用hibernate_序列?或者..?使用
hibernate seq
,当然,当您说hibernate生成它时,您不能自己提供任何。或者,即使您提供了一些值,该值也会被覆盖。您是说多个实体共享相同的休眠序列吗?不一定。你可以定义,否则,检查我的addemdum。如果您只为每个实体定义了一个序列,那么是的,它将使用相同的序列。谢谢。实际上,Oracle不具备自动增量功能。但是,当我保存@Entity时,我将@Id字段保留为空。然后EntityManager不知何故从某处生成一个id并将其插入。我在启用控制台的SQL输出时就知道了这一点。回到我的问题上来,我的配置中这个id来自哪里?它肯定使用序列。现在,如果它使用触发器或内联插入,请将hibernate配置为显示sql或检查是否生成了触发器hibernate不使用触发器,它只在插入时获取nextval
。