簡體   English   中英

多對多關系返回空集合

[英]Many-to-many relation returns empty collection

我正在嘗試創建兩個實體,它們之間具有多對多關系。 第一個實體是將PID作為主鍵的Person ,第二個是將SID作為主鍵的Serie 在數據庫中,有一個表TJV_5_SERIE_2_PERSON ,表示這些實體之間的多對多關系。

數據庫中的表

問題是當我檢索任何實體時,用@ManyToMany注釋的Collection始終為空。 因此,我假設我在代碼中弄亂了一些內容,以解釋為什么我的多對多關系不起作用。

我通過在Netbeans 9.0中生成“來自實體類的Restful Web Services”來檢索這兩個實體。 這樣,我可以使用這些服務成功檢索所有屬性,但帶有@ManyToMany批注的Collection始終為空。

任何想法,為什么它不被喚醒贊賞。 這是第一次嘗試,請原諒任何愚蠢的錯誤。

人類:

@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 + '}';
    }

}

我不確定100%,但是您可能無法通過Serie.class方法上方的@XMLTransiet注釋檢索任何結果

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

嘗試查看文檔https://docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlTransient.html或相關文章隱藏xml消息中的實體變量-@XmlTransient不起作用

另一個問題是在兩個對應的@ManyToMany表之間級聯數據。 這意味着您具有交集,並且當您使用某種類型的級聯但需要發送POST請求時,數據會自動顯示在此表中。 這意味着在您的服務類層中,您可以創建一個負責創建Person的方法,並為此外鍵將此Person對象分配一個Serie。 關於級聯的文章在這里:) https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM