Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate和Oracle 10g方言通过JPA生成我的id?_Java_Hibernate_Orm_Jpa_Oracle10g - Fatal编程技术网

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