簡體   English   中英

使用不帶@GeneratedValue批注的JPA實體ID

[英]Use JPA entity id without @GeneratedValue annotation

我正在使用spring-boot-starter-data-jpa 如果我的代碼不帶注釋@GeneratedValue ,我應該在我的實體ID上使用注解@GeneratedValue ,並在mysqldb中自動生成PRIMARY KEY嗎?

當我在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")

這將從數據庫中創建的序列生成器中獲取值

我已經了解了這種行為的原因。 如果沒有@GeneratedValue批注,則不會自動生成ID,並且始終將值0的ID傳遞給mysql數據庫。 在這種情況下,mysql從AUTO_INCREMENT生成ID值。 這是默認行為。

要禁用此行為,可以設置下一個參數:

SET SQL_MODE ='NO_AUTO_VALUE_ON_ZERO'

然后在第二次調用測試方法personPersist()之后,我們得到了錯誤。 在這種情況下,如果沒有@GeneratedValue批注,我們將無法在mysql DB中生成ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM