Использовать идентификатор сущности JPA без аннотации @GeneratedValue - PullRequest
1 голос
/ 21 апреля 2019

Я работаю с spring-boot-starter-data-jpa.Должен ли я использовать аннотацию @GeneratedValue для моего идентификатора сущности, если мой код работает без него, и автоматически генерировать PRIMARY KEY в mysqldb?

При запуске теста в sqltable появляется новая строка с идентификатором со следующим значением AUTO_INCREMENT, в то время как каждый раз передается идентификатор 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 ]

0 голосов
/ 23 апреля 2019

Я понял причину такого поведения. Без аннотации @GeneratedValue идентификатор не генерируется автоматически, а идентификатор со значением 0 всегда передается в базу данных mysql. В этом случае mysql генерирует значение идентификатора из AUTO_INCREMENT. Это поведение по умолчанию.

Чтобы отключить это поведение, вы можете установить следующий параметр:

SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'

Тогда после второго вызова теста метода personPersist () мы получаем ошибку. В этом случае мы не можем сгенерировать ID в mysql DB без аннотации @GeneratedValue.

0 голосов
/ 23 апреля 2019

Я также столкнулся с той же проблемой, я добавил генератор последовательности в БД скажем 'idGenerator', а затем добавил

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

Это будетвзять значения из генератора последовательностей, созданного в БД

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...