我正在使用 spring-boot-starter-data-jpa
。如果我的代码在没有它的情况下工作并在 mysqldb 中自动生成 PRIMARY KEY,我应该在我的实体 ID 上使用注释 @GeneratedValue
吗?
当我在 sqltable 中运行测试时出现新行,其 ID 具有以下 AUTO_INCREMENT 值,而每次通过 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
最佳答案
我也遇到了同样的问题,我在数据库中添加了序列生成器说'idGenerator',然后添加
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idGenerator")
@SequenceGenerator(name='dbname', sequenceName="idGenerator")
,
这将从数据库中创建的序列生成器中获取值
关于java - 使用不带 @GeneratedValue 注释的 JPA 实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780878/