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


79
@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抽象类?有什么用?


Answers:


119

让我回答这个问题:
首先,使用注释作为我们的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开发。


对于Oracle 11.2,注释SequenceGenerator的正确语法为@SequenceGenerator(name =“ seq”,sequenceName =“ ORACLE_SEQ”,distributionSize = 1)。否则,如果没有分配大小参数,它将产生非常奇怪的生成结果(在我的情况下为负)。
hariprasad

@hariprasad在我的情况下,如果未设置,则增量为10。但这仍然是可选参数。
Rugal

我的一位朋友说@Id是唯一标识。如果您将首先遵循代码方法,那么它将是主键,否则将是区别。您能解释一下上述句子吗?
P Satish Patro

@PSatishPatro正确,Id当然是唯一记录。但是,即使对于NoSQL,我们在表定义中总会包含此类内容
Rugal

22

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

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

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

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


8
“表明持久性提供者必须使用数据库标识列为实体分配主键。”您能解释一下吗
Lijo 2013年

2
@ 404一种用于生成主键的策略数据库是保留一个带有列(YMMV)的表,它们仅在其中存储分配的ID。当必须输入新行时,将生成并使用原本不在表中的新ID。
Sotirios Delimanolis 2013年

1
那么id的自动递增是吗?
Lijo 2013年

1
@ 404我认为这取决于数据库。使用MySQL看起来是这样,但是其他DB可能会有所不同。
Sotirios Delimanolis

11
Simply, @Id: This annotation specifies the primary key of the entity. 

@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 defines four strategies: 
1. Generation Type . TABLE, 
2. Generation Type. SEQUENCE,
3. Generation Type. IDENTITY   
4. Generation Type. AUTO

GenerationType.SEQUENCE

With this strategy, underlying persistence provider must use a database sequence to get the next unique primary key for the entities. 

GenerationType.TABLE

With this strategy, underlying persistence provider must use a database table to generate/keep the next unique primary key for the entities. 

GenerationType.IDENTITY
This GenerationType indicates that the persistence provider must assign primary keys for the entity using a database identity column. IDENTITY column is typically used in SQL Server. This special type column is populated internally by the table itself without using a separate sequence. If underlying database doesn't support IDENTITY column or some similar variant then the persistence provider can choose an alternative appropriate strategy. In this examples we are using H2 database which doesn't support IDENTITY column.

GenerationType.AUTO
This GenerationType indicates that the persistence provider should automatically pick an appropriate strategy for the particular database. This is the default GenerationType, i.e. if we just use @GeneratedValue annotation then this value of GenerationType will be used. 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.