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);