rest api with spring : 基于另一个实体创建一个新实体

rest api with spring : Create a new entity based on another one

我是 java 和 spring 的新手。我有两个 classes

Class 1

class A {
  Long id;
  String attr1;
  String attr2;
 //getters & setters
}

Class 2

class B {
  Long id;
  String attr1;
  String attr2;
  String attr3;
  String attr4;
  @ManyToOne
  A a;
 //getters & setters
}

我希望当我通过提供 class A 的现有对象的 ID 调用我的 api 时,我将能够将公共属性插入 [=31 的新对象=] B.

请问最好的方法是什么

你觉得这样做怎么样?

@PostMapping("/test/{idObjectA}")
public B createNewB(@PathVariable Long idObjectA, @RequestBody B objectB){
 //verify if ids are null..
 A objectA = aRepository.getAbyId(idObjectA)

 objectB.setAttr1(objectA.getAttr1);
 objectB.setAttr2(objectA.getAttr2);
 objectB.setA(objectA);
 B result = bRepository.save(objectB);
return result; 
}

你说的是REST,那就按照REST.

根据你的描述,ObjectA 是一种容器类型,可以有多个 A 实例(基于 id),例如jobs object 会 job-id

考虑到这一点 /test/A [HTTP POST] // POST, GET, PUT 在容器 object 级别

到A项

/test/A/{id}  // POST, GET, PUT at container's item level

创建 A

的 child 资源 B
/test/A/{id}/B  // POST, GET, PUT at B level (which is a child of A)

因为你对 B 使用了 @ManyToOne,所以 A 的实例似乎可以有多个 child 项 B

访问B

/test/A/{id}/B

访问 B 的项目

/test/A/{id}/B/{id}

现实生活中这样的例子是:

mycompany/jobs/123/positions/1

最后说一句: 在大多数情况下,您可以对实体 A 使用 @OneToMany(而不是对实体 B 使用 @ManyToOne),因为通常您需要从 parent 访问 child。但是如果你也需要从 child 访问 parent,你可以双向访问。即在实体 A 中使用 @OneToMany,在实体 B 中使用 @ManyToOne

关于在 Object A 和 B

之间使用公共属性的问题

一些上下文优先:

您可以继承基本实体的属性(同名)。例如,如果您有一个“人”作为基础实体——它可以有姓名、姓氏、年龄等。现在“员工”、“经理”等可以从“人”继承。但是在这个例子中,person 实际上可以是一个抽象的 class,因为您将自己创建一个 person 实体。 See this to learn more.

在另一个例子中,如果你有一个从“parent”继承的“children”实体——这两个实体可以独立存在并且它们可以有相同的 属性 名称(姓名、last_name、年龄等)- 但他们会有 不同的 数据。

在您的情况下,您似乎不仅希望实体 A 和 B 具有相同的属性,而且实际上还希望共享相同的数据。那是错误的设计。它不是标准化的数据库设计。理想情况下,您应该在数据库中没有数据重复。

但是如果你必须这样做(出于某些无法解释的原因),你可以这样做(使用组合而不是继承):

Class SharedData{
   String sharedAttr1;
   String sharedAttr2;
}

Class A{
   SharedData sharedAttributes;
   String attrA1;

   @OneToMany(). // if you want navigation from A to B
   B b;
}

Class B{
   SharedData sharedAttributes;
   String attrB1;
    
   @ManyToOne // if you want navigation from A to B
   @JoinColumn(name="<identity_column_of_A>", nullable=false)
   A a;
}