Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不带@GeneratedValue注释的JPA实体id_Java_Mysql_Spring_Jpa - Fatal编程技术网

Java 使用不带@GeneratedValue注释的JPA实体id

Java 使用不带@GeneratedValue注释的JPA实体id,java,mysql,spring,jpa,Java,Mysql,Spring,Jpa,我正在使用spring boot starter数据jpa。如果我的代码不使用注释@GeneratedValue而在mysqldb中自动生成主键,我是否应该在实体id上使用注释@GeneratedValue 当我在sqltable中运行测试时,会出现一个ID为以下自动增量值的新行,而每次ID为0时都会通过 实体 @Data @Entity @RequiredArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE, force

我正在使用
spring boot starter数据jpa
。如果我的代码不使用注释
@GeneratedValue
而在mysqldb中自动生成主键,我是否应该在实体id上使用注释
@GeneratedValue

当我在sqltable中运行测试时,会出现一个ID为以下自动增量值的新行,而每次ID为0时都会通过

实体

@Data
@Entity
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class Person {

    @Id
//  @GeneratedValue(strategy = GenerationType.IDENTITY)// use or not - the same effect
    private int id;
    @NonNull
    private String name;
    @NonNull
    private String surname; 
}
public interface PersonRepository extends CrudRepository<Person, Integer> {     
    Person findByNameAndSurname(String name, String surname);
}
存储库

@Data
@Entity
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class Person {

    @Id
//  @GeneratedValue(strategy = GenerationType.IDENTITY)// use or not - the same effect
    private int id;
    @NonNull
    private String name;
    @NonNull
    private String surname; 
}
public interface PersonRepository extends CrudRepository<Person, Integer> {     
    Person findByNameAndSurname(String name, String surname);
}
mySql表

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `surname` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8

我也面临同样的问题,我在DB中添加了序列生成器,比如“idGenerator”,然后添加

@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“idGenerator”)
@SequenceGenerator(name='dbname',sequenceName=“idGenerator”)


这将从DB中创建的序列生成器中获取值,我也面临同样的问题,我在DB中添加了序列生成器,比如说“idGenerator”,然后添加

@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“idGenerator”)
@SequenceGenerator(name='dbname',sequenceName=“idGenerator”)


这将从DB中创建的序列生成器中获取值

我已经理解了这种行为的原因。如果没有@GeneratedValue注释,则不会自动生成ID,并且始终将值为0的ID传递给mysql数据库。在这种情况下,mysql通过自动增量生成ID值。这是默认行为

要禁用此行为,可以设置下一个参数:

将SQL_MODE='NO_AUTO_VALUE_设置为0'


然后在第二次调用测试方法personPersist()之后,我们得到错误。在这种情况下,如果没有@GeneratedValue注释,我们无法在mysql DB中生成ID。

我已经理解了这种行为的原因。如果没有@GeneratedValue注释,则不会自动生成ID,并且始终将值为0的ID传递给mysql数据库。在这种情况下,mysql通过自动增量生成ID值。这是默认行为

要禁用此行为,可以设置下一个参数:

将SQL_MODE='NO_AUTO_VALUE_设置为0'


然后在第二次调用测试方法personPersist()之后,我们得到错误。在这种情况下,如果没有@GeneratedValue注释,我们无法在mysql DB中生成ID。

因为默认分配了Generatory,所以我们的测试从不检查您的实体是否有ID,这是GeneratedValue的整个点。正如前面的评论所示,请在保存person为0的id之前添加断言,并在保存后添加一个断言,确保其不是0。您可能会发现需要注释。如果不是,这仍然是可移植性的良好实践。由于默认分配的Generatory,我们的测试从不检查您的实体是否有ID,这是GeneratedValue的全部要点。正如前面的评论所建议的,请在保存ID之前为person is 0添加断言,并在保存ID之后为person is not 0添加断言。您可能会发现需要注释。如果不是,它仍然是移植性的良好实践。