Java Spring数据JPA同时保存两个实体,列“中为空值”;“用户id”;
我的应用程序中有用户,用户有工作详细信息,我使用一种方法设置用户/工作详细信息数据,然后添加新用户或修改现有用户 这是设置用户/工作数据的方法:Java Spring数据JPA同时保存两个实体,列“中为空值”;“用户id”;,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我的应用程序中有用户,用户有工作详细信息,我使用一种方法设置用户/工作详细信息数据,然后添加新用户或修改现有用户 这是设置用户/工作数据的方法: public WorkDetail setWorkerData(PatchWorkerRequest request, User user, WorkDetail workDetail) { if (request.getName() != null) { user.setName(request.getNam
public WorkDetail setWorkerData(PatchWorkerRequest request, User user, WorkDetail workDetail) {
if (request.getName() != null) {
user.setName(request.getName());
}
if (request.getIdCode() != null) {
user.setIdCode(request.getIdCode());
}
if (request.getEmail() != null) {
user.setEmail(request.getEmail());
}
if (request.getPhone() != null) {
user.setPhone(request.getPhone());
}
if (request.getAddress() != null) {
user.setAddress(request.getAddress());
}
if (request.getSignatureLevel() != null) {
user.setSignatureLevel(request.getSignatureLevel());
}
if (request.getAltContactRelation() != null) {
user.setAltContactRelation(request.getAltContactRelation());
}
if (request.getAltContactPhone() != null) {
user.setAltContactPhone(request.getAltContactPhone());
}
if (request.getRoles() != null) {
user.setRoles(request.getRoles());
}
if (request.getStatus() != null) {
user.setStatus(request.getStatus());
}
// Work details
if (request.getJobRelation() != null) {
workDetail.setJobRelation(request.getJobRelation());
}
if (request.getSalary() != null) {
workDetail.setSalary(request.getSalary());
}
if (request.getDistricts() != null) {
workDetail.setDistricts(request.getDistricts());
}
if (request.getCompetences() != null) {
workDetail.setCompetences(request.getCompetences());
}
workDetail.setUser(user);
user.setWorkDetail(workDetail);
return workDetailRepository.save(workDetail);
}
现在,修改现有辅助进程可以很好地使用以下代码:
public WorkDetail modifyWorker(Long workerId, PatchWorkerRequest request) {
WorkDetail workDetail = this.getWorkDetailById(workerId);
User user = userService.getUserById(workDetail.getUser().getId());
return setWorkerData(request, user, workDetail);
}
但是当我尝试创建一个新的用户/工作者时,我得到一个错误,即“user\u id”列中的null值违反了notnull约束“。我想这是因为workDetail和用户没有正确连接
这是创建新工作进程的方法:
public WorkDetail createWorker(PatchWorkerRequest request) {
WorkDetail workDetail = new WorkDetail();
User user = new User();
String generatedPassword = userService.generatePassword(8);
user.setPassword(passwordEncoder.encode(generatedPassword));
emailService.sendMail("SYDA", new String[]{request.getEmail()},
"Project SYDA",
"New password: " + generatedPassword + ".);
return setWorkerData(request, user, workDetail);
}
另外,在保存用户后,是否有任何方法可以发送电子邮件,以便在出现错误时不会发送电子邮件
实体:
用户:
您可以使用spring boot starter邮件依赖项来获取此工作您可以使用spring boot starter邮件依赖项来获取此工作您需要先保存
用户
,然后再将其添加到工作细节
。新的User
对象没有id,这就是为什么会出现异常。
大概是这样的:
public WorkDetail createWorker(PatchWorkerRequest request) {
WorkDetail workDetail = new WorkDetail();
User user = new User();
String generatedPassword = userService.generatePassword(8);
user.setPassword(passwordEncoder.encode(generatedPassword));
user = userRepository.save(user);
emailService.sendMail("SYDA", new String[]{request.getEmail()},
"Project SYDA",
"New password: " + generatedPassword + ".);
return setWorkerData(request, user, workDetail);
}
或者可以在setWorkerData
方法中添加saveUser
调用
...
if (request.getStatus() != null) {
user.setStatus(request.getStatus());
}
user = userRepository.save(user);
...
您需要先保存
用户
,然后再将其添加到工作细节
。新的User
对象没有id,这就是为什么会出现异常。
大概是这样的:
public WorkDetail createWorker(PatchWorkerRequest request) {
WorkDetail workDetail = new WorkDetail();
User user = new User();
String generatedPassword = userService.generatePassword(8);
user.setPassword(passwordEncoder.encode(generatedPassword));
user = userRepository.save(user);
emailService.sendMail("SYDA", new String[]{request.getEmail()},
"Project SYDA",
"New password: " + generatedPassword + ".);
return setWorkerData(request, user, workDetail);
}
或者可以在setWorkerData
方法中添加saveUser
调用
...
if (request.getStatus() != null) {
user.setStatus(request.getStatus());
}
user = userRepository.save(user);
...
这意味着在尝试保存workdetail对象时,用户对象未被保存。 因此没有要放置的用户id,因此为空值。 我可以给你发邮件吗?(特别是它们之间的映射)。
我认为,如果要同时保存两个实体,应该使用类似于
@OneToOne(cascade=CascadeType.PERSIST)
的东西。这意味着在尝试保存workdetail对象时,用户对象未被保存。
因此没有要放置的用户id,因此为空值。
我可以给你发邮件吗?(特别是它们之间的映射)。
我认为,如果您想同时保存两个实体,您应该使用类似于@OneToOne(cascade=CascadeType.PERSIST)
的东西。在setWorker()中
方法您尝试为workDetail
对象设置user
,但user
对象没有其user\u id
,因为此用户对象处于分离模式,并且仍然没有user\u id
与用户对象关联
//some code in your setWorker() Method.
workDetail.setUser(user); //you try to set a detached User Object which doesn't have it's id.
user.setWorkDetail(workDetail);
return workDetailRepository.save(workDetail);
所以,在设置之前保存user
,并确保user
对象被持久化到数据库中
在上述代码之前添加此行
user = userRepository.save(user); // add this line....
workDetail.setUser(user); //now your User Object will have it's id.
user.setWorkDetail(workDetail);
return workDetailRepository.save(workDetail);
还有另一种方法可以执行此操作,而无需调用save()
方法,只需使用级联的概念即可有关详细信息,请在setWorker()中使用此方法
方法您尝试为workDetail
对象设置user
,但user
对象没有其user\u id
,因为此用户对象处于分离模式,并且仍然没有user\u id
与用户对象关联
//some code in your setWorker() Method.
workDetail.setUser(user); //you try to set a detached User Object which doesn't have it's id.
user.setWorkDetail(workDetail);
return workDetailRepository.save(workDetail);
所以,在设置之前保存user
,并确保user
对象被持久化到数据库中
在上述代码之前添加此行
user = userRepository.save(user); // add this line....
workDetail.setUser(user); //now your User Object will have it's id.
user.setWorkDetail(workDetail);
return workDetailRepository.save(workDetail);
还有另一种方法可以执行此操作,而无需调用save()
方法,只需使用层叠的概念即可有关详细信息,请使用此方法您的映射是错误的。以下是您应该做的:
在WorkDetail中:
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name=“user\u id”)
私人用户代码>
在用户中:
@OneToOne(mappedBy=“user”)
@杰索尼奥雷
私人工作详情代码>您的映射错误。
以下是您应该做的:
在WorkDetail中:
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name=“user\u id”)
私人用户代码>
在用户中:
@OneToOne(mappedBy=“user”)
@杰索尼奥雷
私人工作详情代码>电子邮件工作正常。电子邮件已发送,但用户未保存在存储库中。请提供.save()方法以获得额外的外观@heikopiirmeth保存方法在Spring Repositories上是默认的电子邮件工作正常。电子邮件已发送,但用户未保存在存储库中。请提供.save()方法以获得额外外观@heikopiirmeth保存方法是Spring Repositories上的默认方法。请添加user
的定义以及WorkDetail
实体类定义@Heiko@VikrantKashyap添加实体请添加用户
的定义以及工作细节
实体类定义@Heiko@VikrantKashyap添加实体将实体添加到原始帖子中,当我修补用户/workdetail时,它会同时保存这两个实体您发布了两次用户实体您是否尝试:@OneToOne(mappedBy=“workdetail”,cascade=CascadeType.PERSIST,fetch=FetchType.LAZY,可选=true)@PrimaryKeyJoinColumn私有用户很遗憾,代码>没有改变任何东西。在原始帖子中添加了实体,当我修补用户/workdetail时,它会同时保存这两个实体。您发布了两次用户实体。您是否尝试:@OneToOne(mappedBy=“workdetail”,cascade=CascadeType.PERSIST,fetch=FetchType.LAZY,optional=true)@PrimaryKeyJoinColumn私有用户可悲的是,代码>没有改变任何事情。嗯。。。现在,它第一次指出相同的错误:“user_id”列中的null值违反了notnull约束。但是当我在postman上再次运行请求时,我发现给定电子邮件中的用户已经存在。在检查数据库后,用户确实创建了数据库,但它没有连接到Worketai