@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/