Spring Data Jpa автоматически не принимает Next Id (PK), он всегда начинается с 1
Я разрабатываю Spring Boot (2.1.7.RELEASE) +Data Jpa + Postgres пример. В этом примере я явно передаю EMP_ID
значение = 100
и затем я позволяю data-jpa автоматически принимать следующий идентификатор, который 101
, Я не уверен, почему это не работает таким образом?
Employee.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Employee extends BaseEntity{
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "EMP_ID", unique = true, nullable = false)
private Integer empId;
@Column(name = "EMP_NAME", unique = true, nullable = false)
private String empName;
@Column(name = "EMP_EMAIL", unique = true, nullable = false)
private String empEmail;
@Builder(builderMethodName="eBuilder")
public Employee(Integer empId, String empName, String empEmail,
Instant createdDate, Instant lastUpdateDate,String createUser, String lastUpdateUser) {
super(createdDate, lastUpdateDate, createUser, lastUpdateUser);
this.empId = empId;
this.empName = empName;
this.empEmail = empEmail;
}
}
BaseEntity.java
@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(name = "createdDate", nullable = false, updatable = false)
private Instant createdDate;
@Column(name = "lastUpdateDate", nullable = false)
@LastModifiedDate
private Instant lastUpdateDate;
@Column(name = "createUser", nullable = false, length = 50)
private String createUser;
@Column(name = "lastUpdateUser", length = 50)
private String lastUpdateUser;
}
MainApp.java
@SpringBootApplication
@EnableJpaAuditing
public class MyExampleApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(MyExampleApplication.class, args);
}
@Autowired
private EmployeeRepository employeeRepository;
@Override
public void run(String... args) throws Exception {
Employee e = Employee.eBuilder().empId(100).empName("Shrutika")
.empEmail("shrutika@hotmail.com")
.createUser("Shrutika")
.lastUpdateUser("Shrutika")
.build();
employeeRepository.save(e);
Employee e1 = Employee.eBuilder().empName("Shantaram")
.empEmail("shantaram@hotmail.com")
.createUser("Shantaram")
.lastUpdateUser("Shantaram")
.build();
employeeRepository.save(e1);
}
}
Даже если я использовал ниже, все-таки не работает хорошо
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emp_generator")
@SequenceGenerator(name="emp_generator", sequenceName = "emp_seq", allocationSize=1)
@Column(name = "EMP_ID", unique = true, nullable = false)
private Integer empId;
Весенняя JIRA: https://jira.spring.io/browse/DATAJPA-1588
2 ответа
Убедитесь, что тип EMP_ID
в базе данных: SERIAL
или же Integer
, Для использования IDENTITY
с postgres это должно быть SERIAL
( https://www.postgresql.org/docs/8.1/datatype.html).
Я явно передаю значение EMP_ID =100, и затем я позволяю data-jpa автоматически принимать следующий идентификатор, равный 101. Я не уверен, почему он не работает таким образом??
Дж. Б. Низет ответил, что в комментариях:
генератор последовательности состоит в получении следующего идентификатора из последовательности базы данных. Не в получении следующего идентификатора из идентификатора, который вы в последний раз вставили самостоятельно.
Я всегда хотел сохранить записи, всегда делая максимальный идентификатор +1. Есть ли способ сделать это с помощью Spring Data JPA
Опять Дж. Б. Низет отметил, что это ужасная идея. Это потребовало бы блокировки или, по крайней мере, индекса для каждой вставки, включая выбор, чтобы определить следующий идентификатор.
Итак: НЕ ДЕЛАЙТЕ ЭТОГО
Если вы все еще хотите это сделать, Влад Михалча описывает, как реализовать собственный генератор идентификаторов. Это должно позволить вам реализовать свой собственный генератор. Конечно, это специфично для Hibernate.
Это будет работать:
@GeneratedValue(strategy=GenerationType.SEQUENCE)