使用 JPA 使用现有数据进行 POST

Posted

技术标签:

【中文标题】使用 JPA 使用现有数据进行 POST【英文标题】:Make a POST with JPA with existing data 【发布时间】:2022-01-24 01:44:52 【问题描述】:

我有以下问题,问题是我有一个实体:

package com.innovart.cpve.user.persistence.entity;

import lombok.Data;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Data
@Table(name = "CPVE_USERS")
public class User 

@Id
@Column(name = "IDUSERS")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idUser;

@Column(name = "IDROLES")
private Long idRol;

@Column(name = "USERNAME")
private String username;

@Column(name = "EMAIL")
private String email;

@Column(name = "PHONE")
private String phone;

@Column(name = "NAME")
private String name;

@Column(name = "LAST_NAME")
private String lastName;

@Column(name = "PASSWORD")
private String password;

@Column(name = "COUNTRY")
private String country;

@Column(name = "CITY")
private String city;

@Column(name = "GRANTS")
private String grant;

@Column(name = "STATE_ACTIVE")
private Integer stateActive;

@Column(name = "REGISTRATION_DATE")
private LocalDateTime registrationDate;


问题是这个后面连接到一个 Oracle DB,我已经有几个注册用户,但是这些是通过 Mockaroo 脚本输入的,当我尝试通过服务保存新用户时,Rest 抛出了我这个错误:

2021-12-22 11:03:53.156 ERROR 23148 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[. 
[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context 
with path [/api] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

oracle.jdbc.OracleDatabaseException: ORA-01400: cannot insert NULL into ("CPVE"."CPVE_USERS"."IDUSERS")

当然我知道问题是因为我已经创建了记录,所以 Spring 尝试创建一个新用户,但它不“知道”它必须从 PK 500 开始。

难道Spring有某种方式自动知道用户PK去哪儿的数据并继续下去?

【问题讨论】:

这可能与数据库使用的ID的生成策略有关。您可能想查看它在您的数据库中设置的内容并更改 @GeneratedValue() 中的策略 "我当然知道问题是因为我已经创建了记录,所以 Spring 尝试创建一个新用户,但它不“知道”它必须从 PK 500 开始。”我不认为这是问题所在。 hibernate 会自动选择一个生成策略。如果您希望休眠从现有序列继续,您可能需要明确告诉它这样做检查 Example 142 这里 docs.jboss.org/hibernate/orm/5.6/userguide/html_single/… TNKS Abdullah,这个例子帮助我理解了发生了什么。通过使用“strategy = GenerationType.AUTO”,Hibernate 在我的 Oracle 数据库中创建了一个名为 Hibernate_Sequence 的序列,它定义了“idUsers”的值,我决定,如示例所示,创建自己的序列它从我决定的值中计算。我把解决方案的代码留在这里,非常感谢大家的贡献 代码:``` @Id @Column(name = "IDUSERS") @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "sequence-generator" ) @SequenceGenerator( name = "sequence-生成器”,sequenceName = “SEC_IDUSER”,initialValue = 501,allocationSize=1 ) private Long idUser; ``` 【参考方案1】:

这看起来像字段 idUser 为空。 一种确保方法是在插入之前将 Use.idUser 设置为某个值,以查看问题是否再次发生

【讨论】:

【参考方案2】:

问题在于,当使用“strategy = GenerationType.AUTO”时,Hibernate 在我的 Oracle 数据库中创建了一个名为 Hibernate_Sequence 的序列,它定义了“idUsers”的值,我决定在示例中创建您自己的序列以从我决定的值中获取计数。

@Id
@Column(name = "IDUSERS")
@GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "sequence-generator"
)
@SequenceGenerator(
        name = "sequence-generator",
        sequenceName = "SEC_IDUSER",
        initialValue = 501,
        allocationSize=1
)
private Long idUser;

这就是我的实体代码的外观,现在如果它已经允许我保存新用户。

【讨论】:

以上是关于使用 JPA 使用现有数据进行 POST的主要内容,如果未能解决你的问题,请参考以下文章

从现有数据库生成 JPA 2 实体

从数据库创建 JPA

使用 spring-data-jpa 自定义 ItemReader

将 playframework 1.2.5 与现有数据库一起使用

Eclipselink 未检测到脏实体

十八sun JPA理解及使用