Отношение «многие ко многим» возвращает пустую коллекцию - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать две сущности, которые имеют отношение многих ко многим.Первый объект - Person с PID в качестве первичного ключа, второй - Serie с SID в качестве первичного ключа.В базе данных есть таблица TJV_5_SERIE_2_PERSON , которая представляет отношения многих ко многим между этими объектами.

таблиц в базе данных

Проблема заключается в том, что при извлечении любой сущности коллекция с аннотацией @ManyToMany всегда пуста.Поэтому я предполагаю, что что-то напутало в моем коде, что объясняет, почему мое отношение «многие ко многим» не работает.

Я получаю эти два объекта, генерируя (в Netbeans 9.0) «Restful Web Services fromСущности классов ».Таким образом, я могу использовать эти сервисы для успешного извлечения всех атрибутов, за исключением того, что Collection с аннотацией @ManyToMany всегда пуст.

Любая идея, почему она не просыпается, приветствуется.Я впервые пробую это, так что извините меня за любые глупые ошибки.

Класс человека:

@Entity
@Table(name = "TJV_5_PERSON")
@XmlRootElement
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PID")
    private Integer id;

    @Column(name = "PNAME")
    private String name;

    @ManyToMany()
    @JoinTable(
        name = "TJV_5_SERIE_2_PERSON",
        joinColumns = @JoinColumn(name = "PID", referencedColumnName = "PID"),
        inverseJoinColumns = @JoinColumn(name = "SID", referencedColumnName = "SID")
    )
        // always empty
    private Collection<Serie> favourites = new ArrayList<Serie>();

    public Person() {
    }

    public Person(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlTransient
    public Collection<Serie> getFavourites() {
        return favourites;
    }

    public void setFavourites(Collection<Serie> favourites) {
        this.favourites = favourites;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 31 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Person other = (Person) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Person{" + "id=" + id + ", name=" + name + ", favourites=" + favourites + '}';
    }

}

Класс серии:

@Entity
@Table(name = "TJV_5_SERIE")
@XmlRootElement
public class Serie implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "SID")
    private Integer id;

    @Column(name = "STITLE")
    private String title;

    // always empty
    @ManyToMany(mappedBy = "favourites")
    private Collection<Person> fans = new ArrayList<Person>();

    public Serie() {
    }

    public Serie(Integer id, String title) {
        this.id = id;
        this.title = title;
    }

    public Integer getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

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

    @XmlTransient
    public Collection<Person> getFans() {
        return fans;
    }

    public void setFans(Collection<Person> fans) {
        this.fans = fans;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 67 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Serie other = (Serie) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Serie{" + "id=" + id + ", title=" + title + ", fans=" + fans + '}';
    }

}

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Другая проблема - каскадирование данных между двумя соответствующими таблицами @ManyToMany.Это означает, что у вас есть пересечение, и данные появляются в этой таблице автоматически, когда вы используете какой-либо тип каскада, но вам нужно отправить запрос POST.Это означает, что на уровне класса обслуживания вы можете создать метод, отвечающий за создание Person, и назначить Serie этому объекту Person, который является внешним ключом.Статья о каскадировании находится здесь :) https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

0 голосов
/ 29 января 2019

Я не уверен на 100%, но вы не можете получить какие-либо результаты из-за аннотации @XMLTransiet выше метода Serie.class

@XmlTransient
public Collection<Person> getFans() {
    return fans;
}

Попробуйте поискать в документации https://docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlTransient.html или всвязанные сообщения Скрыть переменную объекта из сообщения xml - @XmlTransient не работает

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