注释@Id和@GeneratedValue(策略= GenerationType.IDENTITY)有什么用?为什么代型是身份?

2022-08-31 09:32:43
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)

我们为什么要使用这个注释?我需要知道这个自动增加我的表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");
    }
}

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


答案 1

首先,使用注释作为我们的配置方法只是一种方便的方法,而不是应对无休止的XML配置文件。

注释继承自 ,指示下面的成员字段是当前实体的主键。因此,你的Hibernate和spring框架以及你可以基于这个注释做一些工作。有关详细信息,请查看javadoc以获取Id@Idjavax.persistence.Idreflect

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

1. 在数据库中定义序列

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

create sequence oracle_seq;

2. 参考数据库序列

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

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

sequenceName是Oracle中一个序列的真实名称,是你想在Java中称呼它的名字。您需要指定它是否与 不同,否则只需使用 。我通常会忽略以节省我的时间。namesequenceNamenamenamesequenceName

3. 在 Java 中使用序列

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

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

该字段是指要使用的序列生成器。请注意,它不是 DB 中的真实序列名称,而是您在 字段中指定的名称。generatornameSequenceGenerator

4. 完成

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

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

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


答案 2

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

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

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

还有其他策略,您可以在此处查看更多策略。


推荐