what is the use of annotations @Id and @GeneratedValue(strategy = GenerationType.IDENTITY)? Why the generationtype is identity?

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

Why we are using this annotations? 我需要知道这个自动递增的表 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");
}
}

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

275963 次浏览

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

@GeneratedValue注释用于指定应该如何生成主键。在你的例子中,你使用了一个 Identity策略

指示持久性提供程序必须为 使用数据库标识列的实体。

There are other strategies, you can see more here.

首先,使用注释作为我们的配置方法只是一种方便的方法,而不是处理无穷无尽的 XML 配置文件。

@Id注释继承自 javax.persistence.Id,表明下面的成员字段是当前实体的主键。因此,您可以使用 Hibernate 和 spring 框架,也可以基于此注释执行一些 reflect工作。详情请参阅 Javadoc 换身份证

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

1. 在数据库中定义序列

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

create sequence oracle_seq;

2. 引用数据库序列

现在我们已经有了数据库中的序列,但是我们需要通过使用 @SequenceGenerator来建立 Java 和 DB 之间的关系:

@SequenceGenerator(name="seq",sequenceName="oracle_seq")

在 Oracle 中,sequenceName是一个序列的真实名称,而在 Java 中,name是你想要调用它的名称。如果 sequenceName不同于 name,则需要指定 sequenceName,否则只需使用 name。为了节省时间,我通常忽略 sequenceName

3. 在 Java 中使用序列

最后,是时候在 Java 中使用这个序列了:

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

generator字段指出要使用哪个序列生成器。注意,它不是 DB 中的实际序列名称,而是在 SequenceGeneratorname字段中指定的名称。

4. 完成

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

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

Now start using these annotations to make your JavaWeb development easier.

简单地说,@Id: 此注释指定实体的主键。

@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 定义了四种策略:

  1. 生成类型,
  2. Generation Type. SEQUENCE,
  3. 世代类型,身份
  4. 发电类型。自动

世代类型,序列

使用此策略,底层持久性提供程序必须使用数据库序列来获取实体的下一个唯一主键。

世代类型表

有了这个策略,底层的持久化提供者必须使用一个数据库表来为实体生成/保留下一个唯一的主键。

IDENTITY 此 GenerationType 指示持久性提供程序必须使用数据库标识列为实体分配主键。IDENTITY 列通常在 SQLServer 中使用。此特殊类型列由表本身在内部填充,而不使用单独的序列。如果底层数据库不支持 IDENTITY 列或类似的变体,那么持久化提供程序可以选择其他适当的策略。在本例中,我们使用的是不支持 IDENTITY 列的 H2数据库。

AUTO 此 GenerationType 表示持久性提供程序应该自动为特定数据库选择适当的策略。这是默认的 GenerationType,也就是说,如果我们只使用@GeneratedValue 注释,那么将使用 GenerationType 的这个值。

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

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

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

为什么使用@Id 注释?

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

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

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

为什么使用@GeneratedValue?

  • By marking the @Id field with @GeneratedValue we are now enabling id generation. Which means that the persistence layer will generate an Id value for us and handle the auto incrementing. Our application can choose 1 of 4 generations strategies:

    1) AUTO

    2)表

    3)顺序

    4)身份

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

策略 = GenerationType.IDENTITY 实际上在做什么?

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


  • 请注意,他们的 id 类型是 bigserial,什么是大序列? 根据后缀 文件bigserial is a large autoincrementing integer

结论

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


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

简而言之,我们想告诉数据库(DB)使用什么策略来生成主键。 现在,主键对于每个不同的行必须是不同的,因此必须有一些策略来告诉 DB 如何区分一行与另一行。

GenerationType让我们定义这种策略。

在这里,@GeneratedValue(stratergy=GenerationType.IDENTITY)告诉我们的数据库将主键存储在标识列中,该标识列是 SQL 中默认的自动递增主键生成的默认列。