JPA:不会自动设置外国ID

时间:2017-07-30 17:37:07

标签: java hibernate jpa foreign-keys relationship

我有两个类,第一个是"聚合器/所有者/无论什么"类:

@Entity
@Table(name = "project")
public class Project {

  @Id
  @GeneratedValue
  private Long id;

  @OneToMany(mappedBy = "project", cascade = CascadeType.PERSIST, fetch = 
  FetchType.EAGER)
  private List<Workspace> workspaces;

这里&#34;聚合&#34;:

@Entity
@Table(name = "workspace")
public class Workspace {

  @Id
  @GeneratedValue()
  private Long id;

  @ManyToOne()
  @JoinColumn(name = "id_project", referencedColumnName = "id", foreignKey = @ForeignKey)
  private Project project;

这里有一些我想要保留的示例结构:

Project
{
  description:"SOMETHING",
  id:null,
  name:"Project Name",
  workspaces:[{id: null, name: "Somenthing", description: "Workspace Name", }]
}

我在这里收到:

@RestController
@RequestMapping("projectRest")
public class ProjectRestController {

  @PostMapping("/create")
  public ResponseEntity<String> create(@RequestBody Project project) {
    try {
        service.insert(project);
        return new ResponseEntity<>("OK", HttpStatus.OK);
    } catch (Exception ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }      
  }

我没有改变任何东西,直到我在这样的课程中保存:

public void save(Project model) throws RuntimeException {
    this.getSession().persist(model);
}

除了工作区表上的id_project关系列之外,它在我的数据库中保存了我想要的所有内容 所以,我的工作区正在失去项目参考,我不知道我做错了什么

1 个答案:

答案 0 :(得分:1)

是的,这是预期的,你有一个双向关系,要求关系的每个部分都有一个对其他部分的引用,你的项目在其中有一个工作区,但反之则不然。

要解决此问题,要么使用单向关系,要么检索工作区对象并在其中设置项目

public void save(Project model) throws RuntimeException {
    Workspace workspace = model.getWorkSpace();
    workspace.setProject(model);
    this.getSession().persist(model);
}