Передача массива, коллекции в базу данных H2 на Java

Не получается корректно передать массив и ArrayList в базу данных H2. Выдаёт ошибку "Basic" attribute should not be a String[] и "Basic" attribute should not be a container соответственно.

Если написать аннотацию @SuppressWarnings("JpaAttributeTypeInspection"), то ошибка пропадает, но в БД записывается очень длинная последовательность непонятных и ненужных мне символов, в то время как обычные строки и числа записываются нормально. В интернете я видел решения этой проблемы для БД с несколькими таблицами, связями и тд, но если я хочу использовать только одну таблицу или даже две, но никак не связывать их между собой то каким образом можно решить эту проблему? К тому же при таких решениях начинает появляться ошибка связанная с типом данных Integer. Не хотелось бы уходить от него в пользу какого-то пользовательского типа, как там предлагается. Вот код класса, где происходит ошибка.

package com.hyperskill.demo1;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Entity
public class Quiz  {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int id;
    private String title;
    private String text;
    private String[] options = new String[4]; // ошибка в этой строке
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private ArrayList<Integer> answer; // ошибка в этой строке

    
    protected Quiz() {
        
    }

    Quiz(String title, String text, String[] options, ArrayList<Integer> answer) {
        if(title == null || title.equals("") || text == null || text.equals("") || options.length < 2 ){
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        } else {
            this.title = title;
            this.text = text;
            this.options[0] = options[0];
            this.options[1] = options[1];
            this.options[2] = options[2];
            this.options[3] = options[3];
            if (answer == null){
                this.answer = new ArrayList<Integer>();
            } else {
                this.answer = answer;
            }

        }
    }
    
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String[] getOptions() {
        return options;
    }

    public void setOptions(String[] options) {
        this.options = options;
    }

    public ArrayList<Integer> getAnswer() {
        return answer;
    }

    public void setAnswer(ArrayList<Integer> answer) {
        this.answer = answer;
    }


}


Ответы (1 шт):

Автор решения: azlov

Выдаёт ошибку "Basic" attribute should not be a String[] и "Basic" attribute should not be a container". Потому что в H2 нет такого типа данных как String[] или ArrayList

Как вариант, можете аннотировать коллекцию @Transient (говорит о том, что такого столбца в БД не будет) и создайте поле типа String в котором как раз и будете хранить эту коллекцию.

private String answer;

@Transient
private ArrayList<Integer> answers;

После выполнения всех манипуляции с коллекцией, сохраняйте ее в удобном виде в поле answer.

→ Ссылка