java - 注解@Id和@GenerateValue(strategy = GenerationType.IDENTITY)有什么用?为什么世代类型是身份?

标签 java sql hibernate java-annotations

@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");
    }
}

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

最佳答案

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

@Id注解继承自javax.persistence.Id,表示下面的成员字段是当前实体的主键。因此,您的 Hibernate 和 spring 框架以及您可以基于此注释执行一些 reflect 工作。详情请查看javadoc for Id

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

1。在数据库中定义序列

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

create sequence oracle_seq;

2。引用数据库序列

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

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

sequenceName 是 Oracle 中序列的真实名称,name 是您想要在 Java 中调用它的名称。如果sequenceNamename不同,则需要指定,否则仅使用name。我通常忽略 sequenceName 以节省时间。

3。在Java中使用序列

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

@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;
}

现在开始使用这些注释来使您的 JavaWeb 开发变得更容易。

关于java - 注解@Id和@GenerateValue(strategy = GenerationType.IDENTITY)有什么用?为什么世代类型是身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769912/

相关文章:

java - Spring中使用@Query注解的原生查询

java - 使用 T 类扩展 ArrayList<T> 的方法

java - 通过在垃圾收集之前使用反射来清理内容,安全地使用 String 作为密码

java - 如何在 Kotlin 中实例化接口(interface)?

sql - SQL Server 中 CTE 的最大递归次数是多少?

sql - <>(尖括号)在 MS-SQL Server 中意味着什么?

java - hibernate、stackoverflow 与特定实体映射

c9.io 中支持 Java 扫描仪吗?

java - 如何在应用程序启动/加载期间执行 SQL 插入查询以填充数据库?

mysql - 不允许为空,但应该可以为空