使用 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 spring-data-jpa 自定义 ItemReader