繁体   English   中英

Spring数据JPA-具有另一个未插入表示相同表字段的外键的子实体

[英]Spring data jpa -Child entity having another foreign key representing same table field not inserted

我有两个实体。 User.java,DirectReport.java

User.java
*************************************
@Entity
@Table(name = "User")
@JsonInclude(Include.NON_NULL)
public class User{
 .....
 ......
    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH,
        CascadeType.REMOVE  })
@JoinColumn(name = "user_code", referencedColumnName = "code")
public List<DirectReports> getDirectReports() {
    return directReports;
}

public void setDirectReports(List<DirectReports> directReports) {
    this.directReports = directReports;
}
}

DirectReport.java
****************************
@ManyToOne(optional=true)
@JoinColumn(name = "directreport_code", referencedColumnName = "code", insertable = false, updatable = false)
public User getDirectReport() {
    return directReport;
}

public void setDirectReport(User directReport) {
    this.directReport = directReport;
}

@Column(name="directreport_code")
public String getDirReportCode() {
    return dirReportCode;
}

public void setDirReportCode(String dirReportCode) {
    this.dirReportCode = dirReportCode;
}

数据已插入子表中。 user_code列也已更新。 但是directreports_code字段设置为null。 有人可以帮忙吗?

编辑:更新数据库,如下所示:

UserService.java
***********************************
User userVar;
DirectReports dr;
   for (String str : model.getDirectReportsCode()) {
   userVar = repository.findByCodeIgnoreCase(str);
   System.out.println("userVar "+userVar.getCode());
   dr = new DirectReports();
   if (userVar != null) {
   dr.setDirReportCode(userVar.getCode());
   list.add(dr);
    }
}
    System.out.println("list " + list);
    model.setDirectReports(list);
    toBeApprovedModel2 = getMainRepository().save(model);
    getMainRepository().flush();
    postApprove(toBeApprovedModel2);

注意:model.getDirectReportsCode()是一个字符串。 我正在迭代,找到相应的用户,将其添加到列表中并在模型对象中进行设置。 我可以在“ getMainRepository()。save(model)”中看到dirReportCode字段的值。

在您的UserService.java尝试在dr对象上也设置userVar

if (userVar != null) {
   dr.setDirReportCode(userVar.getCode());
   dr.setDirectReport(userVar);  // <----- do this

 //rest of your code

更新资料

在您的User实体中更改以下内容:

    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH,
        CascadeType.REMOVE  })
@JoinColumn(name = "user_code", referencedColumnName = "code")
public List<DirectReports> getDirectReports() {
    return directReports;
}

为了(请注意添加的mappedBy属性和消除@JoinColumn ):

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH,
            CascadeType.REMOVE  }, mappedBy="directReport")
public List<DirectReports> getDirectReports() {
    return directReports;
}

我没有在服务器端构造Directreport,而是在客户端本身构造了对象,并将其保存在我遇到任何问题的地方。 但是,我不知道为什么在服务器端构造对象不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM