【问题标题】:Spring Data Rest JPA OneToMany Null JoinColumnSpring Data Rest JPA OneToMany Null JoinColumn
【发布时间】:2017-05-29 13:11:36
【问题描述】:

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

@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为空。所有其他字段都已找到,但未建立关系。

我错过了什么?

【问题讨论】:

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


【解决方案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
}

【讨论】:

    【解决方案2】:

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

    还有,

    关联每个对象后保存哈曼

    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

    【讨论】:

    • Jaehyun,谢谢,但我使用的是 Spring Data Rest,我无法控制像这样设置对象。它通过 Jackson 进入并直接进入 Hibernate。
    • @szxnyc 你能写下你的帖子正文吗?
    • 我添加了用于发布宠物关系的 URL。我认为您希望看到我使用的是 URL,而不是实际的宠物定义。
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2021-02-10
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多