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

新手上路,请多包涵
@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抽象类?有什么用?

原文由 Lijo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

1.在数据库中定义Sequence

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

 create sequence oracle_seq;

2.参考数据库序列

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

 @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 字段是指您要使用的序列生成器。请注意,它不是 DB 中的真实序列名称,而是您在 — 的 SequenceGenerator name 字段中指定的名称。

4.完成

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

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

现在开始使用这些注解来简化您的 JavaWeb 开发。

原文由 Rugal 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

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

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题