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添加断言。您可能会发现需要注释。如果不是,它仍然是移植性的良好实践。