如何使用 Hibernate 映射 PostgreSQL 数组

新手上路,请多包涵

有没有人通过 Hibernate 成功地将 PostgreSQL 中的数值数组映射到 Java 中的数值数组?

查询语句:

 CREATE TABLE sal_emp (name text, pay_by_quarter integer[]);
INSERT INTO sal_emp VALUES ('one', '{1,2,3}');
INSERT INTO sal_emp VALUES ('two', '{4,5,6}');
INSERT INTO sal_emp VALUES ('three', '{2,4,6}');

映射:

 <hibernate-mapping>
    <class name="SalEmp" table="sal_emp">
        <id name="name" />
        <property name="payByQuarter" column="pay_by_quarter" />
    </class>
</hibernate-mapping>

班级:

 public class SalEmp implements Serializable{
    private String name;
    private Integer[] payByQuarter;
    ...// getters & setters
}

查询表时出现异常。

原文由 pstanton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 951
2 个回答

Hibernate 不支持开箱即用的数据库数组(例如映射到 java.sql.Array 的)。

arrayprimitive-array Hibernate 提供的类型用于将 Java 数组映射到支持表中——它们基本上是一对多/元素集合映射的变体,所以这就是不是你想要的。

最新的 PostgreSQL JDBC 驱动程序(8.4.whatever)支持 JDBC4 Connection.createArrayOf() 方法以及 ResultSet.getArray()PreparedStatement.setArray() 方法,所以你可以编写你自己的 UserType b177dcebfa3606ec1ec395900fd1c984227f— 和 PreparedStatement.setArray() 方法 --- 提供数组支持。

是一个处理 Oracle 数组的 UserType 实现,它提供了一个很好的起点,使其适应处理 java.sql.Array 相当简单。

原文由 ChssPly76 发布,翻译遵循 CC BY-SA 3.0 许可协议

Maven 依赖

您需要做的第一件事是在您的项目中设置以下 Hibernate Types Maven 依赖 pom.xml 配置文件:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

假设您的数据库中有此表:

 create table event (
    id int8 not null,
    version int4,
    sensor_names text[],
    sensor_values integer[],
    primary key (id)
)

你想像这样映射它:

 @Entity(name = "Event")
@Table(name = "event")
@TypeDefs({
    @TypeDef(
        name = "string-array",
        typeClass = StringArrayType.class
    ),
    @TypeDef(
        name = "int-array",
        typeClass = IntArrayType.class
    )
})
public static class Event extends BaseEntity {

    @Type( type = "string-array" )
    @Column(
        name = "sensor_names",
        columnDefinition = "text[]"
    )
    private String[] sensorNames;

    @Type( type = "int-array" )
    @Column(
        name = "sensor_values",
        columnDefinition = "integer[]"
    )
    private int[] sensorValues;

    //Getters and setters omitted for brevity
}

string-arrayint-array 是可以在 BaseEntity 超类中定义的自定义类型:

 @TypeDefs({
    @TypeDef(
        name = "string-array",
        typeClass = StringArrayType.class
    ),
    @TypeDef(
        name = "int-array",
        typeClass = IntArrayType.class
    )
})
@MappedSuperclass
public class BaseEntity {

    @Id
    private Long id;

    @Version
    private Integer version;

    //Getters and setters omitted for brevity
}

StringArrayTypeIntArrayType 是 Hibernate Types 项目提供的类。

测试时间

现在,当您插入几个实体时;

 Event nullEvent = new Event();
nullEvent.setId(0L);
entityManager.persist(nullEvent);

Event event = new Event();
event.setId(1L);
event.setSensorNames(
    new String[] {
        "Temperature",
        "Pressure"
    }
);
event.setSensorValues(
    new int[] {
        12,
        756
    }
);
entityManager.persist(event);

Hibernate 将生成以下 SQL 语句:

 INSERT INTO event (
    version,
    sensor_names,
    sensor_values,
    id
)
VALUES (
    0,
    NULL(ARRAY),
    NULL(ARRAY),
    0
)

INSERT INTO event (
    version,
    sensor_names,
    sensor_values,
    id
)
VALUES (
    0,
    {"Temperature","Pressure"},
    {"12","756"},
    1
)

原文由 Vlad Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题