@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)注释的用途是什么?为什么generationtype是身份?

Lij*_*ijo 69 java sql hibernate java-annotations

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

为什么我们使用这个注释?我需要知道这个自动增量我的表id值.(GenerationType.IDENTITY)当我们使用这个注释时,是否有其他类型的实际发生

public class Author extends Domain
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id") 
    private Integer id;

    @Basic(optional = false)
    @Column(name = "name") 
    private String name;

    @Column(name = "address") 
    private String address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "authorId")
    private List<Book>
    bookList;

    public Author()
    { 
        setServiceClassName("wawo.tutorial.service.admin.AuthorService");
    }
}
Run Code Online (Sandbox Code Playgroud)

*是否有必要扩展Domain抽象类?有什么用?

Rug*_*gal 102

让我回答这个问题:
首先,使用注释作为我们的配置方法只是一种方便的方法,而不是应对无穷无尽的XML配置文件.

@Id注释是继承自javax.persistence.Id,表示下面的构件字段是当前实体的主键.因此,你的Hibernate和spring框架以及你可以reflect根据这个注释做一些工作.有关详细信息,请检查Id的javadoc

@GeneratedValue注释是配置指定列(字段)的增量的方式.例如,在使用时Mysql,您可以auto_increment在表的定义中指定使其自增量,然后使用

@GeneratedValue(strategy = GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

在Java代码中表示您也承认使用此数据库服务器端策略.此外,您可以更改此注释中的值以满足不同的要求.

1.在数据库中定义序列

例如,Oracle必须使用sequence增量方法,比如我们在Oracle中创建一个序列:

create sequence oracle_seq;
Run Code Online (Sandbox Code Playgroud)

2.参考数据库序列

既然我们在数据库中有序列,但我们需要通过使用@SequenceGenerator以下方式建立Java和DB之间的关系:

@SequenceGenerator(name="seq",sequenceName="oracle_seq")
Run Code Online (Sandbox Code Playgroud)

sequenceName是Oracle中序列的真实名称,name是您希望用Java调用它的.您需要指定sequenceName它是否不同name,否则只需使用name.我经常忽略sequenceName节省时间.

3.在Java中使用序列

最后,是时候在Java中使用这个序列了.只需添加@GeneratedValue:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
Run Code Online (Sandbox Code Playgroud)

generator字段指的是您要使用的序列生成器.请注意,它不是DB中的实际序列名称,而是您在name字段中指定的名称SequenceGenerator.

4.完成

所以完整版应该是这样的:

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}
Run Code Online (Sandbox Code Playgroud)

现在开始使用这些注释来简化JavaWeb开发.

  • Oracle 11.2 的注释 SequenceGenerator 的正确语法是@SequenceGenerator(name="seq",sequenceName="ORACLE_SEQ",allocationSize=1)。否则,如果没有 allocateSize 参数,它会给出非常奇怪的生成结果(在我的例子中为负)。 (3认同)

Sot*_*lis 21

在对象关系映射上下文中,每个对象都需要具有唯一标识符.您可以使用@Id批注指定实体的主键.

@GeneratedValue注释用于指定主键应该如何生成的.在您的示例中,您使用的是Identity策略

指示持久性提供程序必须使用数据库标识列为实体分配主键.

还有其他策略,你可以在这里看到更多.

  • "表示持久性提供程序必须使用数据库标识列为实体分配主键."您能否解释此问题 (4认同)
  • @404 数据库用于生成其主键的一种策略是保留一个包含一列(YMMV)的表,其中仅存储分配的 ID。当必须输入新行时,将生成并使用原来不在表中的新 ID。 (2认同)
  • @404我认为这取决于数据库。MySQL 看起来就是这样,但其他数据库可能会有所不同。 (2认同)

小智 6

Simply, @Id: This annotation specifies the primary key of the entity. 

@GeneratedValue: This annotation is used to specify the primary key generation strategy to use. i.e Instructs database to generate a value for this field automatically. If the strategy is not specified by default AUTO will be used. 

GenerationType enum defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 
Run Code Online (Sandbox Code Playgroud)

参考:-https : //www.logicbig.com/tutorials/java-ee-tutorial/jpa/jpa-primary-key.html


小智 5

我们为什么使用这个注释?

  • 首先我想提醒大家,诸如 之类的注释@Id正在向持久层(我假设为 hibernate)提供元数据。这些元数据很可能存储在 .class 文件中(但不存储在数据库中)并且是用于告诉hibernate如何识别、解释和管理实体。那么,为什么要使用注释呢?为您的持久层提供有关如何管理实体的正确信息。

为什么使用@Id注解?

  • @Id注释是使用 JPA 创建实体时所需的两个强制注释之一。另一位是@Entity@Id为我们做了两件事:

    1)表示该字段映射到数据库表时将成为该类的唯一标识符

    2)的存在@Id让持久层知道该类中的所有其他字段都将映射到数据库行

为什么使用@GenerateValue?

  • 通过用 标记该@Id字段,@GeneratedValue我们现在可以启用id generation. 这意味着持久层将为我们生成一个 Id 值并处理自动递增。我们的应用程序可以选择 4 代策略之一:

    1) 自动

    2) 表格

    3) 顺序

    4)身份

  • 如果未指定策略,则假定为 AUTO

Strategy = GenerationType.IDENTITY 实际在做什么?

  • 当我们指定生成策略时,GenerationType.IDENTITY我们告诉持久化提供者(hibernate)让数据库处理 id 的自动递增。如果您使用 postgres 作为底层数据库并将策略指定为IDENTITY,hibernate 将执行以下命令:
create table users (
       id  bigserial not null,
        primary key (id)
    )

Run Code Online (Sandbox Code Playgroud)
  • 请注意,他们输入的 id 是bigserial,big​​serial 是什么?根据 postgres文档bigserial is a large autoincrementing integer.

结论

  • 通过指定:
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

Run Code Online (Sandbox Code Playgroud)
  • 您已告诉底层持久层使用 id 字段作为数据库中的唯一标识符。还告诉持久层让数据库处理 id 的自动递增GenerationType.IDENTITY