java - 如何使用 PostgreSQL 和 Hibernate 映射 Java 多维数组

标签 java arrays postgresql hibernate multidimensional-array

我正在尝试使用 Hibernate 从 PostgreSQL 映射一个三维数组。需要存储多层神经网络的权重。

我应该如何做得更好?

我遇到的所有来源都太旧了。在我看来,有更方便的方法来应对它。

UPD:我需要 Double[][][]

最佳答案

Hibernate 类型项目

hibernate-types项目允许您为 JPA 和 Hibernate 实体属性保留多维数组。

数据库表

因此,假设您有以下 plane 数据库表:

CREATE TABLE plane (
    id INT8 NOT NULL,
    name VARCHAR(255),
    seat_grid seat_status[][],
    PRIMARY KEY (id)
)

seat_status 是一个 PostgreSQL 枚举:

CREATE TYPE seat_status
AS ENUM (
    'UNRESERVED',
    'RESERVED',
    'BLOCKED'
);

JPA实体

您可以按如下方式映射平面数据库表:

@Entity(name = "Plane")
@Table(name = "plane")
@TypeDef(
    name = "seat_status_array",
    typeClass = EnumArrayType.class
)
public static class Plane {
 
    @Id
    private Long id;
 
    private String name;
 
    @Type(
        type = "seat_status_array",
        parameters = @org.hibernate.annotations.Parameter(
            name = "sql_array_type",
            value = "seat_status"
        )
    )
    @Column(
        name = "seat_grid",
        columnDefinition = "seat_status[][]"
    )
    private SeatStatus[][] seatGrid;
 
    //Getters and setters omitted for brevity

    public SeatStatus getSeatStatus(int row, char letter) {
        return seatGrid[row - 1][letter - 65];
    }
}

因此,您需要声明要使用的适当 Hibernate 类型。对于枚举,您需要使用 EnumArrayType:

@TypeDef(
    name = "seat_status_array",
    typeClass = EnumArrayType.class
)

@Type 注释允许您将参数传递给 Hibernate 类型,如 SQL 数组类:

@Type(
    type = "seat_status_array",
    parameters = @org.hibernate.annotations.Parameter(
        name = "sql_array_type",
        value = "seat_status"
    )
)

测试时间

现在,当您持久化以下 Post 实体时:

entityManager.persist(
    new Plane()
        .setId(1L)
        .setName("ATR-42")
        .setSeatGrid(
            new SeatStatus[][] {
                {
                    SeatStatus.BLOCKED, SeatStatus.BLOCKED,
                    SeatStatus.BLOCKED, SeatStatus.BLOCKED
                },
                {
                    SeatStatus.UNRESERVED, SeatStatus.UNRESERVED,
                    SeatStatus.RESERVED, SeatStatus.UNRESERVED
                },
                {
                    SeatStatus.RESERVED, SeatStatus.RESERVED,
                    SeatStatus.RESERVED, SeatStatus.RESERVED
                }
            }
        )
);

Hibernate 将发出正确的 SQL INSERT 语句:

INSERT INTO plane (
    name,
    seat_grid,
    id
)
VALUES (
    'ATR-42',
    {
        {"BLOCKED", "BLOCKED", "BLOCKED", "BLOCKED"},
        {"UNRESERVED", "UNRESERVED", "RESERVED", "UNRESERVED"},
        {"RESERVED", "RESERVED", "RESERVED", "RESERVED"}
    },
    1
)

并且,在获取实体时,一切都按预期工作:

Plane plane = entityManager.find(Plane.class, 1L);

assertEquals("ATR-42", plane.getName());
assertEquals(SeatStatus.BLOCKED, plane.getSeatStatus(1, 'A'));
assertEquals(SeatStatus.BLOCKED, plane.getSeatStatus(1, 'B'));
assertEquals(SeatStatus.BLOCKED, plane.getSeatStatus(1, 'C'));
assertEquals(SeatStatus.BLOCKED, plane.getSeatStatus(1, 'D'));
assertEquals(SeatStatus.UNRESERVED, plane.getSeatStatus(2, 'A'));
assertEquals(SeatStatus.UNRESERVED, plane.getSeatStatus(2, 'B'));
assertEquals(SeatStatus.RESERVED, plane.getSeatStatus(2, 'C'));
assertEquals(SeatStatus.UNRESERVED, plane.getSeatStatus(2, 'D'));

关于java - 如何使用 PostgreSQL 和 Hibernate 映射 Java 多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44242335/

相关文章:

java - 无法从 byte[] 读取 JPEG 文件

java - 如何通过进行 ajax 调用,使用 java servlet、jquery、json 对象从数据库结果创建 html 页面中的自动完成文本框

c++ - 使用数组的段错误

postgresql - 与其他图数据库相比,AgensGraph 重吗?

sql - 如何在 Postgres 中实现 Oracle count(distinct) over partition

mysql - 在 ubuntu 中将 postgres 转储转换为 mysql 转储

Java 7 默认语言环境

java - 为什么 storm 从 spout 重放元组而不是在崩溃的组件上重试?

java - 房子强盗问题如何这样做

javascript - 在 Angular 中写入嵌套对象数组时出现问题