Как создать связь 1: n с гибернацией? - PullRequest
1 голос
/ 21 июня 2020

Я использую спящий режим для представления базы данных с тремя основными объектами: Пользователь, Проект и Комментарий. Пользователь и проект наследуются от базового класса. Также у проекта неограниченное количество комментариев. В POJO я попытался представить коллекцию комментариев, связанных с проектом, с помощью List<Comment>.

Моя основная проблема заключается в том, когда ii go и возьму проект, который содержит ряд ссылок на комментарии внутри список java вызовет исключение IllegalArgumentException, говорящее, что он не может получить доступ к полю id комментария, поскольку он получает только ArrayList.

Caused by: java.lang.IllegalArgumentException: Can not set int field com.project.objects.Comment.id to java.util.ArrayList

Мои классы следующие - без конструктора / сеттера / получателя это просто:

@MappedSuperclass
public abstract class Base {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String name;
    @Column
    private String longDesc;
    @Column
    private String briefDesc;
    @Column
    @ElementCollection(targetClass=String.class)
    private List<String> goals;
    @Column
    private String picture;
    @Column
    private int cType;
@Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
    @Column
    private String start;
    @Column
    private String end;
    @Column
    private String manager;
    @ElementCollection(targetClass=Comment.class)
    @ManyToOne(targetEntity = Comment.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "comment_id")
    private List<Comment> comments;
@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
    @Id
    @Column(name="comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String comment;
    @Column
    private int rating;
    @Column
    private int pcuser;
    @Column
    private int cType;

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Ваша ассоциация 1: N неверна, так как на самом деле сейчас это N: 1. Правильным будет:

Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
    @Column
    private String start;
    @Column
    private String end;
    @Column
    private String manager;
    @OneToMany(mappedBy = "project", fetch = FetchType.EAGER)
    private List<Comment> comments;

И в вашем Comment классе:

@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
    @Id
    @Column(name="comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String comment;
    @Column
    private int rating;
    @Column
    private int pcuser;
    @Column
    private int cType;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_project", nullable = false)
    private Project project;
    // THIS is the required and obrigatory mapping that you forgot.
    // It's the foreing key itself

Заявление об отказе от ответственности

Я никогда раньше не использовал Hibernate с наследованием (обычно это без необходимости сложный, а также бесполезный для реляционной базы данных), но проверьте `https://www.baeldung.com/hibernate-inheritance` и `https://marcin-chwedczuk.github.io/mapping-inheritance-in-hibernate` для получения дополнительной информации.
0 голосов
/ 21 июня 2020

Вы используете аннотацию @ManyToOne для comments, но это должно быть @OneToMany.

Чтобы использовать @OneToMany, вам понадобится столбец с названием что-то вроде project_id в таблице comment, на которую вы можете ссылаться из поля @OneToMany. У вас есть это?

Если нет, то как вы связываете комментарии с проектами в своей базе данных?

Между прочим, с помощью Hibernate действительно легко создавать плохо работающие системы, потому что это имеет тенденцию чтобы скрыть стоимость обращения к базе данных. Вы сказали, что с проектом может быть связано любое количество комментариев. Вы действительно хотите загружать их все каждый раз, когда код загружает проект? Допустим, вам просто нужен список проектов, например, для заполнения списка выбора. Простая загрузка этого списка также загрузит все комментарии в системе, даже если они вам на самом деле не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...