весеннее исключение аннотации к маю - PullRequest
0 голосов
/ 01 ноября 2019

Я использую весеннюю загрузку.

У меня есть класс с именем Datum и класс с именем User. Пользователь может иметь много данных. Таким образом, отношение один ко многим с точки зрения пользователя. Теперь я хочу создать эти классы.

Вот что я пробовал:

public class Datum{
 ...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private User user;
 ...
}

И:

public class User{
...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    Set<Datum> data = new HashSet<>();//i have tried list-arrayList too
...
}

Но это дает мне ошибку org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements:.

Что здесь не так?

Ответы [ 3 ]

1 голос
/ 01 ноября 2019
public class Datum{
 ...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private User user;
 ...
}

Это не отношение OneToMany . Это ManyToOne , глядя на ваш класс пользователя.

Это сделает работу:

public class Datum {
 ...
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private User user;
 ...
}
0 голосов
/ 02 ноября 2019

Отношение «один ко многим» - это отношение «многие к одному» с другой стороны. Вы должны отобразить это следующим образом:

public class Datum{
...
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
...
}

И:

public class User{
...
    @OneToMany(
        mappedBy = "user",
        cascade = CascadeType.ALL,
        orphanRemoval = true
    )
    private Set<Datum> data = new HashSet<>();
...
}

Как вы можете видеть, отношение «многие к одному» на стороне опорных точек. Кроме того, он должен иметь FetchType.LAZY для повышения производительности, и, если не может быть Datum без пользователя, вы также должны объявить "orphanRemoval = true".

0 голосов
/ 01 ноября 2019

Поскольку у пользователя может быть много данных, то в классе класса пользователя отношение будет

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List<Datum> datums = new ArrayList<>()

А в классе Datum отношения не нужны.

...