java - 使用不带 @GeneratedValue 注释的 JPA 实体 ID

标签 java mysql spring jpa

我正在使用 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/

相关文章:

java - 如何从操作监听器调用方法,而不会使 JFrame 卡住并等待操作监听器完成?

java - Rest 服务的 Application 类生命周期是什么?

java - HashMap 和 ArrayList 的 Android OutOfMemoryError

mysql - Docker compose不会为mysql8创建用户、密码和数据库

php - 从 mysqli 数据库、PHP 语句中检索到的字符串不完整

java - Hibernate 4 : org. hibernate.HibernateException: 没有找到当前线程的 session

java - 无法理解 Math.min(0,-0) 的输出

mysql - 处理子查询,每行返回多行。数据库 : Mysql, SQL

java - jdbctemplate 和乐观锁

spring-data跨店实体管理