@GeneratedValue注释中生成器属性的重要性

时间:2015-09-29 13:30:25

标签: java hibernate jpa

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="myseq") 
@SequenceGenerator(name="myseq",sequenceName="MY_SEQ") 
private long id; 

generator="myseq"注释@GeneratedValuename="myseq" @SequenceGeneratorJava.Lang.IllegalArgumentException的重要性。对所有实体使用相同的生成器名称是好的做法,还是应该为每个实体提供不同的名称,目前我对每个实体都有不同的顺序,请咨询

3 个答案:

答案 0 :(得分:1)

@SequenceGenerator定义了用于生成实体主键的生成器。

name属性为其提供了一个名称,以便在@GeneratedValue注释中引用它。 sequenceName参数表示实际数据库中序列的名称。因此,在这种情况下,Hibernate将在您的数据库中查找名为MY_SEQ的序列。

@SequenceGenerator(name="myseq", sequenceName="MY_SEQ") 

接下来你有@GeneratedValue。您可以指定用于PK生成的策略(序列,表等)和生成器(由您在上面的序列生成器定义中指定的名称引用)。

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="myseq") 

因此,为了回答您的问题,这些注释的name / generator参数用于命名和引用应该用于生成PK的生成器。

答案 1 :(得分:0)

问题的答案可以从javadoc读到@SequenceGenerator

  

定义在为GeneratedValue批注指定生成元素时可以通过名称引用的主键生成器。可以在实体类或主键字段或属性上指定序列生成器。 生成器名称的范围是全局到持久性单元(跨所有生成器类型)。

我强调了生成器名称的范围是全局到持久性单元这一重要事项 - 这是由规范定义的,因此你不能定义多个生成器同名。但是,如果将其名称放在generator注释的@GeneratedValue字段中,则可以将已定义的生成器重用于多个主键。在这种情况下,我建议在类似于命名查询的实体上定义@SequenceGenerator,而不是在特定PK上定义它。

如果每个实体都有单独的序列,则必须为每个生成器指定一个不同的名称。然后,您必须在@GeneratedValue中使用此名称。如果不这样做,将使用默认生成器,这与任何@SequenceGenerator定义的生成器完全不同。这就是它,即使我更喜欢使用而不是默认生成器,生成器与主键字段一起定义,并且将使用@GeneratedValue注释。 Java EE API只是接近理想,但仍然不存在......

为了说明,下面的代码将使用默认序列生成器,如果允许,它将由hibernate自动创建。:

@Entity
public class Entity {
  @GeneratedValue(strategy=GenerationType.SEQUENCE)  // generator is missing, using default generator
  @SequenceGenerator(name="myseq", sequenceName="MY_SEQ") // name is required for generator, but it is not used with @GeneratedValue on this field
  private Long id;
}

另一方面,您可以定义您的生成器并使用它来生成实体类的PK值:

@Entity
@SequenceGenerator(name="myseq", sequenceName="MY_SEQ") // name is required for generator, it is referenced by generator field in @GeneratedValue below
public class Entity {
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq")  // generator myseq defined above is used
  private Long id;
}

您甚至可以将@SequenceGenerator注释放在不同的实体上,只要您仍然在@GeneratedValue的生成器字段中通过其名称引用它,它就没有任何区别。

答案 2 :(得分:-1)

调用MY_SEQ序列,将'long id'的值设为MY_SEQ + 1