java使用不带@GeneratedValue注释的JPA实体id
我正在与spring-boot-starter-data-jpa
合作。如果我的代码不使用注释@GeneratedValue
,我应该在实体id上使用注释@GeneratedValue
,并在mysqldb中自动生成主键吗
当我在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);
}
测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringRestInventoryPersistenceTests {
@Autowired
private PersonRepository personRepository;
@Test
public void personPersist() {
Person person = new Person("John", "Smith");
assertTrue(person.getId() == 0);
personRepository.save(person);
assertTrue(person.getId() == 0);
Person person2 = personRepository.findByNameAndSurname("John", "Smith");
assertEquals(person.getName(), person2.getName());
}//test passed
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
# 1 楼答案
我也面临同样的问题,我在DB中添加了序列生成器,比如“idGenerator”,然后添加
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idGenerator") @SequenceGenerator(name='dbname' , sequenceName="idGenerator")
这将从DB中创建的序列生成器中获取值
# 2 楼答案
我理解这种行为的原因。如果没有@GeneratedValue注释,则不会自动生成ID,并且始终将值为0的ID传递给mysql数据库。在这种情况下,mysql通过自动增量生成ID值。这是默认行为
要禁用此行为,可以设置下一个参数:
将SQL_MODE='NO_AUTO_VALUE_设置为0'
然后在第二次调用测试方法personPersist()之后,我们得到错误。在这种情况下,如果没有@GeneratedValue注释,我们无法在mysql数据库中生成ID