当前位置: 首页 > 知识库问答 >
问题:

使用空 ID 保存实体 JPA

钮边浩
2023-03-14

我试图创建一个注册用户的功能。

@Service
public class RegistrationService {
    private AccountRepository accountRepository;
    private UserRepository userRepository;
    private final Logger logger = LogManager.getLogger(RegistrationService.class);
    
    public Boolean createNewUser(Registration registration) {
        User user = new User();
        user.setUserName(registration.getUserName());
        user.setPassword(registration.getPassword());
        logger.info("attempting to create user: {}", user);
        
        try {
            userRepository.save(user);          
        } catch(Exception e) {
            logger.error("Failed to register user: {}", e.getStackTrace());
            return false;
        }
        
        Account account = new Account();
        account.setUserId(user.getId());
        account.setBillingAddress(registration.getBillingAddress());
        account.setBillingCountry(registration.getBillingCountry());
        account.setBillingProvince(registration.getBillingProvince());
        account.setPhoneNumber(registration.getPhoneNumber());
        account.setZip(registration.getZip());
        logger.info("attempting to create account: {}", account);
        
        try {
            account = accountRepository.save(account);          
        } catch(Exception e) {
            logger.error("Failed to register account: {}", e.getStackTrace());
            return false;
        }
        
        
        return true;
    }
}

我遵循了这篇文章中的建议:将空作为id保存,并Hibernate,但解决方案对我不起作用。这是我的用户类

package com.company.app.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name="user")
@Data
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String userName;

    private String password;

    
    public Long getId() {
        return this.id;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    public String getUserName() {
        return this.userName;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    public String getPassword() {
        return this.password;
    }
}

这是我的账户类

package com.company.app.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name="account")
@Data
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private Long userId;

    private String billingAddress;
    
    private String billingProvince;
    
    private String billingCountry;

    private String phoneNumber;

    private String zip;
    
    public Long getId() {
        return this.id;
    }
    
    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getUserId() {
        return userId;
    }

    public String getBillingAddress() {
        return billingAddress;
    }

    public void setBillingAddress(String billingAddress) {
        this.billingAddress = billingAddress;
    }

    public String getBillingProvince() {
        return billingProvince;
    }

    public void setBillingProvince(String billingProvince) {
        this.billingProvince = billingProvince;
    }

    public String getBillingCountry() {
        return billingCountry;
    }

    public void setBillingCountry(String billingCountry) {
        this.billingCountry = billingCountry;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}

我的日志显示了以下输出

2021-04-14 14:40:09.265  INFO 15092 --- [nio-8080-exec-1] c.c.app.service.RegistrationService      : attempting to create user: User(id=null, userName=evan, password=test123)
2021-04-14 14:40:09.266 ERROR 15092 --- [nio-8080-exec-1] c.c.app.service.RegistrationService      : Failed to register user: com.company.app.service.RegistrationService.createNewUser(RegistrationService.java:26)

共有2个答案

归俊杰
2023-03-14

最后,ID需要一个值。< br >在您的例子中,ID被注释为@ generated value(strategy = generation type。IDENTITY)
这意味着您不必在程序中设置ID的值。< br >但是仍然需要一个值,因此DB必须负责设置ID。< br >例如,在mysql-table中,您可以通过将ID-Column定义为

`ID` bigint(20) NOT NULL AUTO_INCREMENT,
陶永望
2023-03-14

我猜你得到这个错误,因为你没有设置id。

尝试添加user.setId(registration.getId());

 类似资料:
  • 我想保存两个实体的差异。旧实体有一个id女巫不是空的。新的id值为null,所以我将它们作为ValueObject进行比较。问题是ValueChange确实保存了差异,但没有保存旧的id。ich如何做到这一点?

  • 我想将行保存在一个简单的表中,该表包含另外两个实体的ID。经过一些尝试,我得到了以下配置。Spring Boot现在可以正确地创建表,列名称为task\u run\u id和project\u id。 但当我调用repo时。保存(参与者)创建了一行,但两列都包含0,而不是所需的ID。不会引发任何错误。 我做错了什么?此外,如果有一些声明对于实现简单的保存和以后的查询是不必要的,请告诉我。

  • 问题内容: 如果我有两个像这样的hibernate实体: 我有一个已经存储的公司 我可以创建一个仅用其ID引用公司的人,而不是加载整个记录,例如: 它是仅保存参考还是使用更新公司? 问题答案: 是的,您可以做到。 它是否仅保存引用,还是使用name = null更新公司? 使用default ,这样,Hibernate将不执行任何操作。因此答案是:它只保存一个外键。 最有效的方法(也适用于JPA)

  • 简而言之,我的问题是如何使用Spring data JPA保存一个具有预置主键(而不是null)的实体。 要进行解释,请考虑一个名为的简单实体类。记住,id没有设置为自动递增,它必须是一个自定义的唯一值。这只是一个小例子。我需要我的实际表中的id是一个自定义的唯一的,比如用户名。 现在,我想我必须插入一个id为101的新客户记录。所料之道是: 但是,没有插入id为101的新客户。那么,我该怎么做呢

  • 我有实体 和EcranChampId 每次尝试保存EcranChamp元素时,我都会出现以下错误 2018-09-25 12:15:42.889警告14216---[nio-8092-exec-8]。w、 s.m.s.DefaultHandlerExceptionResolver:无法转换请求元素:org。springframework。豆子。ConversionNotSupportedExcep

  • 我使用的是Spring数据jpa。将子实体添加到父实体后,我将父实体保存到数据库。我想得到孩子的身份证,但我发现我得到的是空的。 我在getId()方法中添加了@GeneratedValue(Strategy=GenerationType.IDENTITY),但它不起作用。 以下是模型: 父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举 这里是我的测试代码: 我得到的输出