Spring Data JPA持久保留大型List <string>属性

时间:2019-03-31 01:34:56

标签: java hibernate jpa spring-data-jpa

使用Spring jpa(List<String> db)保留巨大的postgresql实体属性的正确方法是什么?我一直在将它转换为byte[],它以bytea的形式存储在db中,但是这会引起不同的格式设置麻烦(甚至只是重写列表)。 List<String>可以多达10.000.000个实体。有时,我只需要列出清单,更改一些要素并写回去。

据我了解,其他选择是:

  1. 使用ElementCollection-我认为这不是解决这么大列表的方法。
  2. 将其存储为带有拆分字符的大字符串-猜想这也不是很有效的选择。

当前,我使用这些方法将列表与byte[]之间进行转换:

    public static List<String> bytesToStringListByInputStream(byte[] bytes) {
        List<String> lines;

        if (bytes == null) {
            return lines;
        }

        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        DataInputStream in = new DataInputStream(bais);
        try {
            while (in.available() > 0) {
                lines.add(in.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return lines;
    }


    public static byte[] arrayListToByteArray(List<String> list){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(baos);
        for (String element : list) {
            try {
                out.writeUTF(element + System.lineSeparator());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return baos.toByteArray();
    }

实体:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class UserFile implements Serializable {
    ...some fields...

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private byte[] fileData;

但是,在不同情况下,更改列表并将其保留后,输出行中会出现随机字符-有时是数字或特殊符号。 我想我可以找到它发生的原因,但是无论如何-这是持久保存大型列表的正确方法(通过byte[] jpa实体字段和bytea postgresql字段)吗?

0 个答案:

没有答案