我正在与"In url.py"
.
.
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'my-model/' , MyModelView , base_name='MyModel')
urlpattern=[...]
合作。如果我的代码在没有实体ID的情况下可以使用注释spring-boot-starter-data-jpa
,并且应该在mysqldb中自动生成PRIMARY KEY,我应该使用它吗?
当我在sqltable中运行测试时,会出现一个新行,该行的ID带有以下AUTO_INCREMENT值,每次id为0时都会通过。
实体
@GeneratedValue
存储库
@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表
@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
答案 0 :(得分:0)
我也遇到了同样的问题,我在数据库中添加了序列生成器说'idGenerator',然后添加
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idGenerator")
@SequenceGenerator(name='dbname' , sequenceName="idGenerator")
,
这将从数据库中创建的序列生成器中获取值
答案 1 :(得分:0)
我已经了解了这种行为的原因。如果没有@GeneratedValue批注,则不会自动生成ID,并且始终将值0的ID传递给mysql数据库。在这种情况下,mysql从AUTO_INCREMENT生成ID值。这是默认行为。
要禁用此行为,您可以设置下一个参数:
SET SQL_MODE ='NO_AUTO_VALUE_ON_ZERO'
然后在第二次调用测试方法personPersist()之后,我们得到了错误。在这种情况下,如果没有@GeneratedValue批注,我们将无法在mysql DB中生成ID。