使用不带@GeneratedValue批注的JPA实体ID

时间:2019-04-21 07:42:05

标签: java mysql spring jpa

我正在与"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

2 个答案:

答案 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。