有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 1 楼答案

    我也面临同样的问题,我在DB中添加了序列生成器,比如“idGenerator”,然后添加

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idGenerator") @SequenceGenerator(name='dbname' , sequenceName="idGenerator")

    这将从DB中创建的序列生成器中获取值

  2. # 2 楼答案

    我理解这种行为的原因。如果没有@GeneratedValue注释,则不会自动生成ID,并且始终将值为0的ID传递给mysql数据库。在这种情况下,mysql通过自动增量生成ID值。这是默认行为

    要禁用此行为,可以设置下一个参数:

    将SQL_MODE='NO_AUTO_VALUE_设置为0'

    然后在第二次调用测试方法personPersist()之后,我们得到错误。在这种情况下,如果没有@GeneratedValue注释,我们无法在mysql数据库中生成ID