0

我正在开发Spring Boot (2.1.7.RELEASE) +Data Jpa + Postgres示例。在此示例中,我明确传递EMP_IDvalue= 100,接下来我允许 data-jpa 自动获取下一个 Id,即101. 我不确定为什么它不以这种方式工作?

雇员.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;
}

主应用程序.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;

Spring JIRA:https ://jira.spring.io/browse/DATAJPA-1588

4

3 回答 3

0

这将起作用:

@GeneratedValue(strategy=GenerationType.SEQUENCE)
于 2020-05-13T16:39:56.503 回答
0

确保EMP_ID数据库上的类型:SERIALInteger。要IDENTITY与 postgres 一起使用,它必须是SERIALhttps://www.postgresql.org/docs/8.1/datatype.html#DATATYPE-SERIAL)。

于 2019-08-12T10:37:46.700 回答
0

我明确传递 EMP_ID 值=100,接下来我允许 data-jpa 自动获取下一个 ID,即 101。我不确定为什么它不能以这种方式工作?

JB Nizet 在评论中回答:

序列生成器包括从数据库序列中获取下一个 ID。不是从您上次插入的 ID 中获取下一个 ID。

我一直想通过总是做 max id +1 来保存记录。有没有办法用 Spring Data JPA 做到这一点

JB Nizet 再次指出这是一个糟糕的想法。它需要锁定每个插入的索引或至少锁定索引,包括选择以确定下一个 id。

所以:不要这样做

如果您仍想这样做,Vlad Mihalcea 描述了如何实现自定义 id 生成器。这应该允许您实现自己的生成器。当然,这是 Hibernate 特有的。

于 2019-08-19T06:40:49.883 回答