当前位置: 首页 > 面试题库 >

Spring Boot中的TransientPropertyValueException

孔乐邦
2023-03-14
问题内容

LoginCredential上课:

@Data
@Entity
public class LoginCredential implements Serializable {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   Long userID;
   String eMail;
   String passwordHash;
   @GeneratedValue(strategy = GenerationType.AUTO)
   @OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY)
   User user;
}

这是我的User课:

@Data
@Entity
public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   Long userID;
   @OneToOne(fetch = FetchType.LAZY,targetEntity = LoginCredential.class)
   @JoinColumn(name = "userID",referencedColumnName = "userID")
   private LoginCredential loginCredential;
}

而且我LoginCredentialControllerPOST -ing方法很简单:

@PostMapping("/login")
LoginCredential newLoginCredential(@RequestBody LoginCredential newLoginCredential) {
    logger.debug(newLoginCredential);
    LoginCredential a=repository.save(newLoginCredential);
    logger.debug(a);
    return a;
}

现在,当我尝试此命令时: curl -X POST -H "Content-Type: application/json" -d "{ \"email\": \"1\"}" http://localhost:8080/login

我得到一个LoginCredential没有任何错误的user字段,值得一提null

这就是为什么我尝试此命令的原因 curl -X POST -H "Content-Type: application/json" -d "{ \"email\": \"1\",\"user\":{} }" http://localhost:8080/login

这给了我错误的说法:

{
  "status" : 500,
  "error" : "Internal Server Error",
  "message" : "org.hibernate.TransientPropertyValueException: object

references an unsaved transient instance - save the transient instance
before flushing : com.mua.cse616.Model.LoginCredential.user ->
com.mua.cse616.Model.User; org.hibernate.TransientPropertyValueException:
object references an unsaved transient instance - save the transient
instance before flushing : com.mua.cse616.Model.LoginCredential.user ->
com.mua.cse616.Model.User”,
“trace”:....
}


Application.properties

pom.xml


问题答案:

你有三个问题

  1. 缺少从保存cascade触发User实体创建的选项LoginCredential
  2. 由于缺乏@MapsId对标注User,让他们共享相同的ID,否则LoginCredential,创造了其User将有不同的ID值两者都有@GeneratedValue(strategy = GenerationType.AUTO)自己的@Id
  3. 没有设置双方的关系…

为了解决所有问题,您需要将实体更改为以下内容(我还删除了一些无用的注释和值);

@Data
@Entity
public class User {

    @Id
    Long userID;

    @JsonBackReference
    @MapsId
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "userID", referencedColumnName = "userID")
    @ToString.Exclude
    private LoginCredential loginCredential;
}

@Data
@Entity
public class LoginCredential {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long userID;
    String eMail;
    String passwordHash;

    @JsonManagedReference
    @OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    private User user;
}

在最终确定端点之前,还需要设置关系的两端;

Optional.ofNullable(loginCredential.getUser())
        .ifPresent(user -> user.setLoginCredential(loginCredential));
loginCredentialRepo.save(loginCredential);


 类似资料:
  • 本文向大家介绍SpringBoot中的Thymeleaf用法,包括了SpringBoot中的Thymeleaf用法的使用技巧和注意事项,需要的朋友参考一下 Thymeleaf Thymeleaf是最近SpringBoot推荐支持的模板框架,官网在thymeleaf.org这里。 我们为什么要用Thymeleaf来作为模板引擎呢?官网给了我们一个非常令人信服的解释: Thymeleaf is a m

  • 本文向大家介绍SpringBoot中的Thymeleaf模板,包括了SpringBoot中的Thymeleaf模板的使用技巧和注意事项,需要的朋友参考一下 一、前言     Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷: 1、JSP 最明显的问题在于它看起来像HTML或XML,但它其实上并不是。大多数的JS

  • 我有一个控制器 服务接口 我想在我的控制器中使用@autowired来使用该服务,但当我运行应用程序时,我得到以下错误 org.springframework.beans.factory.beanCreationException:创建名为“demo application”的bean时出错:注入autowired依赖项失败;嵌套异常为org.SpringFramework.Beans.Facto

  • null 非常感谢你的帮助

  • 本文向大家介绍Springboot中@Value的使用详解,包括了Springboot中@Value的使用详解的使用技巧和注意事项,需要的朋友参考一下 Springboot通过@Value注解将配置文件中的属性注入到容器内组件中(可用在@Controller、@Service、@Configuration、@Component等Spring托管的类中)  1.普通字符串注入 例:yml中存在key

  • Eureka Discovery服务器(包括/config/*服务器上的云配置服务)正在向Eureka服务器注册,并且Eureka仪表板显示了该实例。此服务在端口9001上运行,启用SSL并进行用户身份验证。服务照常工作。 然后我创建了一个新的SpringBoot服务,它连接到Eureka并注册到它。由于使用了自签名证书,我在这篇文章中编写了一个小的SSLConfguration类:如何覆盖Spr

  • 我们有一个SpringBoot(版本1.5.12)REST Api,带有springfox-swagger2和springfox-swagger-ui(版本2.9.2) 我可以在http://localhost:8080/swagger-ui.html看到Swagger UI 我如何配置swagger-ui来读取我的swagger.yaml/json配置文件,而不是自动生成它?我尝试了几个配置都没

  • 我正在尝试对我的Spring Boot应用程序进行dockerize。 这是我的docker作曲文件 我的dockerfile 我可以看到我的战争已经展开。在日志中我可以看到 在/usr/local/tomcat/webapps目录中,我可以看到这个根目录。war和根文件夹存在。我用以下命令启动docker: 当我访问localhost:8080Tomcat说Http状态404-未找到。 这里是执