[英]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.