Как правильно сохранить огромное свойство сущности List<String>
с помощью Spring jpa (postgresql
db)? Я конвертировал его в byte[]
, который хранился как bytea
в дБ, однако это вызывает различные проблемы с форматированием (даже просто переписывая список).
List<String>
может достигать 10.000.000 объектов. иногда мне просто нужно взять список, изменить несколько элементов и написать его обратно.
Как я понимаю, другие варианты:
- используйте
ElementCollection
- я думаю, что это не решение для таких больших списков.
- Храните его в виде большой строки с разделенными символами - но это тоже не слишком эффективный вариант.
В настоящее время я использую эти методы для преобразования списка в / из 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)?