Hibernate не может создать экземпляр абстрактного класса или интерфейса: java.util.List

У меня есть родительско-дочерние отношения между объектами MyUser и Circuit. Когда я пытаюсь сохранить MyUser с помощью myUserRepository.save (myUser), я получаю следующую ошибку:

org.hibernate.InstantiationException: Cannot instantiate abstract class or interface:  : java.util.List
    at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:79) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.tuple.component.AbstractComponentTuplizer.instantiate(AbstractComponentTuplizer.java:84) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.type.ComponentType.instantiate(ComponentType.java:580) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:500) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:497) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:54) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]

Вот обе сущности:

MyUser:

@Entity
@Data
public class MyUser {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @NotBlank
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    @Email
    @Column(unique = true)
    private String email;

    @NotBlank
    private String password;

    private String chargeBeeCustomerID;

    private String company = null;

    @Enumerated(EnumType.STRING)
    private UsagePurpose usagePurpose = null;

    @Enumerated(EnumType.STRING)
    private CountryCode countryCode = null;

    private Instant createdAt = Instant.now();

    @Embedded
    private MyUserDetails details = new MyUserDetails();

    private double creditBalance = 0;

    @OneToMany(mappedBy = "myUser", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Circuit> circuitList = new ArrayList<>();

    public void addCircuit(Circuit circuit) {
        this.circuitList.add(circuit);
        circuit.setMyUser(this);
    }

    public void removeCircuit(Circuit circuit) {
        this.circuitList.remove(circuit);
        circuit.setMyUser(null);
    }

    @Override
    public String toString() {
        return email;
    }
}

Схема:

@Entity
@Data
public class Circuit {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @NotBlank
    private String circuitID;

    @NotBlank
    private String name;

    @NotNull
    @Enumerated(EnumType.STRING)
    private ContinentCode continentCode;

    @Enumerated(EnumType.STRING)
    private CountryCode countryCode;

    @NotNull
    private boolean enabled;

    private boolean hasOnlyIPAclAccess;

    @ElementCollection
    private List<String> ipACL;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fk_my_user")
    private MyUser myUser;

    public Circuit() {
        circuitID = generateCircuitID();
        name = circuitID;
        enabled = true;
        hasOnlyIPAclAccess = true;
        ipACL = new ArrayList<>();
    }

    private static String generateCircuitID() {
        return RandomStringUtils.randomAlphanumeric(15);
    }

    @Override
    public int hashCode() {
        return this.circuitID.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || obj.getClass() != this.getClass())
            return false;
        Circuit circuit = (Circuit) obj;
        return circuit.getCircuitID().equals(this.circuitID);
    }
}

Примечательно, что когда я впервые создаю пользователя, дочерний элемент (Circuit) еще не создан. Он может быть создан намного позже. В чем причина этой ошибки и как ее решить?

Любая помощь приветствуется.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 976
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь инициировать отношение "один ко многим" со значением по умолчанию. Вместо создания нового списка ArrayList попробуйте запустить его с помощью null.

Это решит вашу проблему, поскольку, если вы попытаетесь сохранить пользователя без назначенной схемы, он будет работать, в противном случае вы получите эту ошибку.

Да, это решило проблему. Но я узнаю этот стиль отсюда: vladmihalcea.com/… Автор использует пустой список для создания экземпляра. Почему в моем случае не работает?

conquester 20.10.2018 22:44

Я не могу видеть весь ваш код, но, как мне кажется, происходит вот что. Вы не добавляете никаких цепей в список цепей вашего пользователя до того, как сохраните их. Итак, поскольку у вас пустой список, это вызывает эту проблему. Конечно, если вместо этого у вас будет нулевое значение, это просто не вызовет никаких проблем.

Alain Cruz 20.10.2018 22:53

Другие вопросы по теме