Spring引导外键实体null

Spring引导外键实体null,spring,hibernate,spring-boot,spring-data-jpa,foreign-keys,Spring,Hibernate,Spring Boot,Spring Data Jpa,Foreign Keys,Spring Boot版本2.1.6 我有用户课程: @Data @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") Long userID; String eMail; public User() { } } @Data @Entity public class LoginCre

Spring Boot
版本
2.1.6

我有
用户
课程:

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    public User()
    {

    }
}
@Data
@Entity
public class LoginCredential {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    String passwordHash;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id", referencedColumnName = "id")
    User user;
    public LoginCredential()
    {

    }
}
LoginCredential
类:

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    public User()
    {

    }
}
@Data
@Entity
public class LoginCredential {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    String passwordHash;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id", referencedColumnName = "id")
    User user;
    public LoginCredential()
    {

    }
}
当我创建
LoginCredential
的实例时,它不应该创建
User
的实例吗

因为我运行了这个命令:
curl-xpost-H“内容类型:application/json”-d“{\'email\”:\“a\”,“passwordHash\”:“b\”)http://localhost:8080/login

我得到了一个
LoginCredential
的实例,但没有
用户的
实例

答复:

{“userID”:1,“passwordHash”:“b”,“user”:null,“email”:“a”}

然后我运行这个命令:
curl-xpost-H“内容类型:application/json”-d“{\”email\:\“c\”,“passwordHash\”:“d\”,“user\”:{}”http://localhost:8080/login

我得到的是没有任何东西,不是相同的ID

答复:

{“userID”:2,“passwordHash”:“d”,“user”:{“userID”:3,“email”:null},“email”:“c”}

我错过了什么吗?如何解决这个问题?

LoginCredentialController
部分:

@PostMapping("/login")
LoginCredential newLoginCredential(@RequestBody LoginCredential newLoginCredential)
{   
    return repository.save(newLoginCredential);
}
我的

我的


希望对你有所帮助,干杯,这是解决办法,我后来问了另一个人,发现了一个

你有三个问题

  • 缺少从
    LoginCredential
    save触发
    User
    实体创建的
    cascade
    选项
  • User
    上缺少
    @MapsId
    注释,以便它们共享相同的id,否则
    LoginCredential
    及其创建的
    User
    将具有不同的id值,因为它们在
    @GeneratedValue(strategy=GenerationType.AUTO)
    列上都有
    @GeneratedValue(strategy=GenerationType.AUTO)
  • 没有设定双方的关系
  • 为了修复将实体更改为以下所需的所有问题(我还删除了一些无用的注释和值)

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

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

    类是用
    实体
    数据
    注释的,那么我应该怎么做?我无法得到你的答案首先,你的代码中有很多错误,我修正了它们。但它给了我,只是在一个风格的方式。但是仔细看,
    id/userID
    是不同的。钥匙坏了@womdok,thx用于修复,应该只是简单地说明一下,但这不是你想要的吗您通过其子用户获取UserCredentials。。样式化的输出来自.intent\u output=True,但关键是:spring.jackson.default property inclusion=ALWAYS。。。当密钥不匹配时-手动验证您的数据库-您确定它没有以这种方式保存吗?感谢您的帮助,我们就快到了。我现在的孩子是父母。但是我希望他们的
    userID/id
    相同。发布您的curl请求响应您询问的
    当我创建LoginCredential实例时,它不应该创建一个User实例吗?
    这取决于您对/login controller方法所做的操作。也请在此发布。编辑,请查看@rimonmostafizBoth结果与预期完全一致-第一个请求不包含
    用户,因此您没有收到任何人,第二个请求包含空
    用户,因此您得到一个,但是请考虑下面的事实:<代码> Log递增的UsRID ID /代码>与<代码>用户的UsRID ID /代码>无关。@ Smutje,请看,我刚开始设置的地方。看,他使用了**创建具有相同父母id**的孩子的东西。我从git和教程中尝试了他的代码。不起作用。他的图坦卡蒙甚至和git代码都不匹配。
    
    spring.jackson.serialization.indent_output=true
    spring.jackson.default-property-inclusion=ALWAYS
    
    @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);