【问题标题】:JPA: foreign Id is not automatically setJPA:未自动设置外国 ID
【发布时间】:2017-07-30 17:37:06
【问题描述】:

我有两个类,第一个是“聚合器/所有者/任何”类:

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

这里是“聚合”:

@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 关系列 所以,我的工作区正在失去它的项目参考,我不知道我做错了什么

【问题讨论】:

  • 因为你没有引用你如何关联你传递给 em.persist 的对象,所以没有人能说太多。
  • 你可以参考stackoverflow.com/questions/13684963/…这个帖子
  • @NeilStockton 这是因为我没有做任何明确的事情,我在我的控制器对象中收到了带有其工作区的 Project 对象,而我没有做任何其他事情。我需要做更多的事情吗?
  • 我不知道什么是“没有明确的”。您有一个 1-N BIDIRECTIONAL 关系,因此您必须在调用 persist 之前设置关系的两侧。你这样做了吗?因为不显示该代码意味着我们不知道
  • @Akash 我已经在我的项目类上映射了工作区,在我的工作区类中我有一个 ManyToOne 注释,不允许使用 mappedBy 属性......但也许我没有得到你的点,我明白了吗?

标签: java hibernate jpa foreign-keys relationship


【解决方案1】:

是的,这是意料之中的,你有一个双向关系,要求关系的每个部分都引用另一部分,你的项目里面有一个工作区,但反之则不然。

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

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

【讨论】:

  • 是的,谢谢,现在它可以工作了……但这不是很奇怪吗?我只是不知道为什么这项工作是必要的。我的意思是这不是预期的行为吗?
  • @diegocolli 这是合乎逻辑的,双向关系的目标是从另一个对象检索任何对象,您不能要求 hibernate 为您执行此操作,因为它需要做额外的工作,这会影响性能,所以我认为这是有道理的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多