如何使用JPA持久化多维Java数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用JPA持久化多维Java数组?相关的知识,希望对你有一定的参考价值。

我想将在内存中工作的应用程序的类转换为实体以便持久化,但它包含双类型字段[] []。我搜索过,但没有找到我如何重写它是持久的。

public class MyClass

protected int num;

private double[] tab;

private double a[][];

private double b[][];

....

答案

如果您需要PostgreSQL(支持SQL阵列的极少数数据库之一),您可以尝试使用自定义转换器。如本例https://thoughts-on-java.org/jpa-21-how-to-implement-type-converter/所示

转换为字符串格式的算法如下:

public String convertToDatabaseColumn(double[][] arr) 
    if (arr == null) 
        return null;
    
    // verify array
    int len1 = arr.length;
    int len2 = -1;
    for (double[] ar : arr) 
        Objects.requireNonNull(ar);
        if (len2 == -1) 
            // first iteration only, if non-empty
            len2 = ar.length;
        
        else 
            if (len2 != ar.length) 
                throw new RuntimeException("PostgreSQL multidimensional arrays require same lengths on every level");
            
        
    
    StringBuilder sb = new StringBuilder();
    sb.append('');
    for (double[] ar : arr) 
        sb.append('');
        for (double a : ar) 
            sb.append(a).append(',');
        
        sb.setLength(sb.length()-1);
        sb.append(",");
    
    sb.setLength(sb.length()-1);
    sb.append('');
    return sb.toString();

当你知道这部分时,你应该能够制作阅读它们的算法。只是不要依赖split或正则表达式,你可以跳过验证。

这不包括需要特殊转义的字符串数组,在某些情况下还包括双引号。该算法在任何地方都没有正确描述,您必须在服务器的源代码中找到它。您可以在我的模块中找到我尝试实现它的here,它允许您使用许多非基本类型的单维数组。

如果您需要另一种不支持数组的数据库,您可以使用自定义格式将其另存为文本,甚至只使用属性转换器进行简单的JSON转换。

以上是关于如何使用JPA持久化多维Java数组?的主要内容,如果未能解决你的问题,请参考以下文章

Java JPA(EclipseLink)如何在持久化实际实体之前接收下一个 GeneratedValue?

如何使用 Spring Data JPA 持久化 JSR-310 类型?

如何使用休眠将mysql与Java连接?例外:没有名为 org.hibernate.tutorial_jpa 的 EntityManager 的持久性提供程序 [关闭]

如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

如何使用 JPA 持久化 LocalDate?

如何使用 JPA 获取最后一个持久化实体的 ID