Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多列映射到作为数组JPA一部分的对象的同一字段_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

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结构与对象表示)是一种保证混乱和较少可维护性的方法,因为在更改一个或另一个时,您必须保持多个事物的有序性。我认为使用一个适当的对象,将产品列表作为应用程序的“业务”表示,并在服务中进行两者之间的映射,或者简单地调整数据库没有任何问题。哦,好的,我将尝试按照您的建议保留我的产品类,然后稍后在发送响应时进行操作。