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;
}
我是 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;
}