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