如何正确地将Postgres数组Map到Java @Entity?

dauxcl2d  于 2023-08-01  发布在  Java
关注(0)|答案(1)|浏览(143)

在我的Postgres表主表中,我有一列是ArrayList,region_id_list,它看起来像这样:{1,2}。此列引用另一个名为Regions的表。在我的Java代码中,我将这个Region类指定为@Entity和@Table,并且我需要将它Map到另一个@Entity类,因此当我获取MainTable Entity时,我可以在其中包含Regions列表。
我试过使用:

  • @ManyToOne
  • @ElementCollection
  • @CollectionTable但是每次我运行它-我都得到bad value long:{1,2}

我有一个类似的输出,但在本例中,orgDistrictsId引用的是单值列,而不是ArrayList。

  1. "orgDistrictsId": {
  2. "id": 1,
  3. "code": "123"
  4. }

字符串

xiozqbni

xiozqbni1#

你没有提供足够的信息来给予一个明确的答案。无论如何,我认为你可能错过了一些主要的SQL和JPA/Hibernate知识。使用数组列表的列不会创建与另一个表的关系。这就削弱了关系数据库的功能。
Postgres存储数组列表数据类型不是为了创建表之间的关系,而是允许您保存和获取数组对象,在Java中,更容易。我不是最大的粉丝,因为这种类型的数据库数据类型可能会很混乱,但它有它的位置。
根据您所描述的,您实际上有一个多对多关系。一个MainTable实体可以有许多区域,听起来像一个Region实体可以与许多MainTable实体相关联。对于多对多关系,最好在两者之间使用桥接表。因此,MainTable实体在一个表中,Region实体在另一个表中。这样就有了一个两列的桥接表。一列表示MainTable行的唯一id,另一列是Region表的唯一id。这种类型的设置允许您不重复不必要的数据。这还允许您大量依赖JPA/Hibernate的能力来理解@ManyToMany关系并设置实体以轻松填充。
表名也是需要考虑的重要因素。他们应该有一个有意义的名字。同样,在语义上,您应该将其称为Region,而不是Regions。我知道它看起来很小,但表的概念是有多行。因此,假定表名应该是单数,并表示许多实体。
我建议你学习一些关系数据库的知识,这样你就能理解表之间如何建立关系的概念(上面提到的桥接表,但是一对多和多对一使用主键和外键的概念来创建关系)。一旦你对SQL设计有了更好的理解,也可以做一些关于JPA/Hibernate的具体学习。

相关问题