当前位置: 首页 > 面试题库 >

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

公冶谦
2023-03-14
问题内容
@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抽象类?有什么用?


问题答案:

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

@Id注释是继承自javax.persistence.Id,指示构件字段下面是当前实体的主键。因此,您的Hibernate和spring框架以及您可以reflect基于此注释进行一些工作。有关详细信息,请检查javadoc以获取ID

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

sequenceName是Oracle中序列的真实名称,name是您要在Java中称呼它的名称。您需要指定sequenceName是否不同于name,否则只需使用即可name。我通常会忽略sequenceName以节省时间。

3.在Java中使用序列

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

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

generator字段指您要使用的序列生成器。请注意,它不是数据库中的真实序列名称,而是您在中的name字段中指定的名称SequenceGenerator

4.完成

因此完整的版本应如下所示:

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

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



 类似资料:
  • 问题内容: 我有2个实体,如“父对子”和“一对多”关系 因此,这里 @LazyCollection(LazyCollectionOption.EXTRA)的 用途是什么,它将何时出现在图片中,例如对哪个带有子列表的操作有好处? 问题答案: 为了给您一个提示,主要是出于性能方面的考虑,您可以开始阅读以下链接: 二级缓存 休眠文档

  • 在我的项目代码库中,我看到许多地方使用了生成的注释。当我通读这些文件时,它说明了以下内容。 Lombok最终会自动将此注释添加到所有生成的构造函数、方法、字段和类型中。 根据文档,Lombok会自动为生成的代码添加注释。除此之外,不会生成任何像或这样的代码。我看不出使用它的理由。 我错过什么了吗?

  • 问题内容: 使用这些批注的重点是要独立于数据库提供程序,而不是重新生成JAR存档。 如果我坚持不懈,那么我首先看不到使用hibernate的意义。如果确实决定切换到其他数据库提供程序,则必须修改类中的注释,然后重新编译应用程序。 问题答案: @Table 批注:@Table批注允许您指定用于将实体保留在数据库中的表的详细信息。 @Table批注提供了四个属性,使您可以覆盖表的名称,目录和架构,并对

  • 问题内容: Hibernate文档具有以下有关注释的信息: 在纯Java API中,未定义时间的时间精度。处理时态数据时,您可能需要描述数据库中的预期精度。时间数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者兼有)。使用@Temporal批注进行微调。 什么意思 什么是数据及其精度?如何调整? 问题答案: 必须为类型为和的持久字段或属性指定此注释。只能为这些类型的字

  • Hibernate文档包含以下注释的信息: 在普通的JavaAPI中,时间的时间精度没有定义。在处理时态数据时,可能需要描述数据库中的预期精度。时态数据可以具有日期、时间或时间戳精度(即实际日期、仅时间或两者)。使用@Temporal注释对其进行微调。 是什么意思?什么是数据及其精度?它如何微调?

  • 问题内容: 通过与这个有关标签的问题进行类比,我注意到,除了纯注释之外,注释还有多种用途。 例子: go:generate可用于代码生成。 godoc使用函数名称表示应解释的注释 建立约束 还有其他我想念的吗? 那里有确定的清单吗? gocontracts和go- swagger 等一些第三方软件包也可以使用它们。他们如何避免彼此冲突? 问题答案: 如前所述,注释不仅是注释,而且是指令。 撰写本文