Java 将多列映射到作为数组JPA一部分的对象的同一字段
我正在尝试将一组对象映射到一个字段。该对象中的所有字段都映射到具有不同名称但结构相似的列。响应结构应为:Java 将多列映射到作为数组JPA一部分的对象的同一字段,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我正在尝试将一组对象映射到一个字段。该对象中的所有字段都映射到具有不同名称但结构相似的列。响应结构应为: "customers": [ { "firstName": "string", "lastName": "string", "products": [ { "description":"string", "amount": "string" }, {
"customers": [
{
"firstName": "string",
"lastName": "string",
"products": [
{
"description":"string",
"amount": "string"
},
{
"description":"string",
"amount": "string"
}
]
}
]
在products字段中,我有一个产品列表(描述和数量)。在DB中,列的存储方式如下
product_des1,product_amt1,product_des2,product_amt2.....product_des30,product_amt30
。我需要将这两个字段映射到产品(对象)。如果可能的话,我应该如何使用JPA注释来解决这个问题
供参考:
客户类别
@Entity
public class Customers implements Serializable {
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;
@ElementCollection
List<Products> products;
}
@Embeddable
public class Product implements Serializable {
@Column(?)
private String description;
@Column(?)
private String amount;
}
在products字段中,我有一个产品列表(描述和数量)。在DB中,列的存储方式如下
产品设计1、产品设计1、产品设计2、产品设计2…..产品设计30、产品设计30
因此,您的产品
JPA实体应该如下所示:
@Embeddable
public class Products implements Serializable {
@Column(name = "product_des1")
private String description1;
@Column(name = "product_amt1")
private String amount1;
@Column(name = "product_des2")
private String description2;
@Column(name = "product_amt2")
private String amount2;
// ... repeat
}
如果您不想在DB和JPA实体之间进行额外的映射(我不建议这样做-我尝试将JPA实体保留为DB行和映射的精确表示,如果需要,在Java中,而不是在不同的技术之间).只需查看一下JPA规范。@Zorglube我检查了一下,但没有找到任何特定于此场景的内容。那么这两个实体都有一个表?你最多可以有30种产品?我会先找出数据库的设计者。如果是这样,Smutje的答案是正确的。尽管重新设计数据库并建立适当的
@ManyToMany
关系可能更有意义。这是目前不可能的,但使用这种方式,我将有几个字段,它应该是“描述”和“金额”。此外,是否建议以编程方式解决此问题?我强烈建议保持数据库和JPA实体相等,即让JPA实体反映DB 1:1,因为它们具有不同的技术(数据库与Java类)和表示(DB结构与对象表示)是一种保证混乱和较少可维护性的方法,因为在更改一个或另一个时,您必须保持多个事物的有序性。我认为使用一个适当的对象,将产品列表作为应用程序的“业务”表示,并在服务中进行两者之间的映射,或者简单地调整数据库没有任何问题。哦,好的,我将尝试按照您的建议保留我的产品类,然后稍后在发送响应时进行操作。