Spring Data Rest JPA OneToMany Null JoinColumn

时间:2017-01-14 04:46:57

标签: hibernate jpa spring-data h2 spring-data-rest

非常简单的一对多关系 - 一个人与多个宠物。

@Entity
class Human{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToMany(mappedBy="human", cascade={CascadeType.ALL})
  private List<Pet> pets;

  // other fields
}

@Entity
class Pet{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne(cascade=CascadeType.ALL)
  @JoinColumn(name="human_id")
  private Human human;

  // others fields
}

这会导致创建两个表 HUMAN(id) PET(id,human_id)

EDIT-1 :我正在使用Spring Data Rest

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

EDIT-2 :以下是我发布数据的最新信息。 我发布给人类:

{
  // human data

  "pets": [
    "http://localhost/pets/1",
    "http://localhost/pets/2"
  ]
}

问题:PET表中的 human_id 列为空。找到所有其他字段但未建立关系。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

我能够通过删除mappedBy并将@JoinColumn放在@OneToMany旁边来保持关系。

这有什么问题吗?性能问题?

@Entity
class Human{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @JoinColumn(name="human_id")
  @OneToMany(cascade={CascadeType.ALL})
  private List<Pet> pets;

  // other fields
}

@Entity
class Pet{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne(cascade=CascadeType.ALL)
  private Human human;

  // others fields
}

答案 1 :(得分:0)

首先,在@ManyToOne列中使用CascadeType.ALL是危险的。 删除宠物时可以删除人。

关联每个对象后保存haman

Human human = new Human();
Pet pet1 = new Pet();
pet1.setHuman(human);
Pet pet2 = new Pet();
pet2.setHuman(human);

List<Pet> pets = new ArrayList<Pet>();
pets.add(pet1);
pets.add(pet2);

human.setPets(pets);

然后保存human