java - @GenerateValue 注解中生成器属性的意义

标签 java hibernate jpa

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

注释@GenerateValue中的generator="myseq"@SequenceGenerator中的name="myseq"有何意义。为所有实体使用相同的生成器名称是一种好的做法,还是应该为每个实体提供不同的名称,目前我对每个实体有不同的序列,请提出建议

最佳答案

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

Defines a primary key generator that may be referenced by name when a generator element is specified for the GeneratedValue annotation. A sequence generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types).

我强调了重要的一点,生成器名称的范围对于持久性单元来说是全局的 - 这是由规范定义的,因此您不能定义多个生成器同名。但是,如果您将其名称放在 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 的生成器字段中通过其名称引用它,则对不同实体的注释没有任何区别。 .

关于java - @GenerateValue 注解中生成器属性的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845313/

相关文章:

java - Fs 只读存档 FilesystemException

java 类和数据库查询

jakarta-ee - 如果对象不在数据库中,如何级联持久化,否则合并?

java - Hibernate/JPA OneToOne 共享 key ,无生成值

spring - 在声明式事务管理中,无论事务是提交还是回滚,如何在 Spring 中获取事务信息?

java - JPA VS JDBC - 2 个问题

java - 如何在 JPA/Spring-Data JPA 中使用审计?

java - 下载文件时获取附加文件内容的j​​sp源代码

java - 如何按接收顺序从多个请求获取 http 响应

java - Jboss 不使用 hibernate-tools 映射我自动生成的实体类