2017-08-25 60 views
0

我試圖在下面運行嵌套的c:loop。在頁面加載之前,我得到一個列表itemsextrascatitemsextrascatService.getExtrascatByIditems(item)的對象。這裏沒問題,我得到了正確的結果數量。但是,嵌套循環顯示不正確。不知道它是一個休眠問題還是jstl。HIbernate - 多對多 - 嵌套c:foreach

JSP

<c:forEach var="itemsextrascat" items="${itemsextrascat}"> 
    <th><c:out value="${itemsextrascat.extrascat.name}"></c:out> </th><br> 
    <table> 
     <c:forEach var="extras" items="${itemsextrascat.extrascat.extras}"> 
      <tr><c:out value="${extras.name}"></c:out></tr> 
      </c:forEach> 
    </table> 
</c:forEach> 

返回

Fruit 
Overy Easy 

Syrups 
Over Medium 

Breakfast Additions 
Sunny Side Up 

所以分類標題是正確的,但是演員是:1)不正確的項目和extrascat和2),他們是不是所有列出所有演員在類別下。很確定它的hibernate是如何調用這個對象的,但我不知所措。

Extrascat.java

@Entity 
@Table(name = "extrascat") 
public class Extrascat implements Serializable { 

    private static final long serialVersionUID = 8644201177004602944L; 

    @Id 
    private int idextrascat; 
    private String name; 

    @ManyToMany(cascade = { CascadeType.ALL }, mappedBy = "extrascat") 
    private Set<Items> items = new HashSet<Items>(); 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "idextras") 
    private Set<Extras> extras; 

    // CONSTRUCTORS 
    public Extrascat() { 

    } 

    public Extrascat(int idextrascat, String name, Set<Items> items, Set<Extras> extras) { 
     this.idextrascat = idextrascat; 
     this.name = name; 
     this.items = items; 
     this.extras = extras; 
    } 

    // GETTERS AND SETTERS 
    public int getIdextrascat() { 
     return idextrascat; 
    } 

    public void setIdextrascat(int idextrascat) { 
     this.idextrascat = idextrascat; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public Set<Items> getItems() { 
     return items; 
    } 

    public void setItems(Set<Items> items) { 
     this.items = items; 
    } 

    public Set<Extras> getExtras() { 
     return extras; 
    } 

    public void setExtras(Set<Extras> extras) { 
     this.extras = extras; 
    } 

} 

Items.java

@Entity 
@Table(name = "items") 
public class Items implements Serializable { 
    private static final long serialVersionUID = -3607451001182083512L; 

    @Id 
    @GeneratedValue 
    private int iditems; 

    @ManyToOne 
    @JoinColumn(name = "idcategories") 
    private Categories categories; 

    @Size(min = 1, max = 35, groups = { PersistenceValidationGroup.class, 
      FormValidationGroup.class }) 
    private String name; 

    @Size(min = 0, max = 100, groups = { PersistenceValidationGroup.class, 
      FormValidationGroup.class }) 
    private String description; 

    private double priceInCents; 
    private int hidden; 

    @OrderColumn 
    @ManyToMany(cascade = {CascadeType.REMOVE}, fetch = FetchType.LAZY) 
    @JoinTable(name="itemsextrascat", joinColumns={@JoinColumn(name="iditems")}, 
      inverseJoinColumns={@JoinColumn(name="idextrascat")}) 
    private Set<Extrascat> extrascat = new HashSet<Extrascat>(); 

    // CONSTRUCTORS 
    public Items() { 

    } 

    public Items(int iditems, Categories categories, String name, String description, double priceInCents, int hidden, Set<Extrascat> extrascat) { 
     this.iditems = iditems; 
     this.categories = categories; 
     this.name = name; 
     this.description = description; 
     this.priceInCents = priceInCents; 
     this.hidden = hidden; 
     this.extrascat = extrascat; 
    } 

    // GETTERS AND SETTERS 
    public int getIditems() { 
     return iditems; 
    } 

    public void setIditems(int iditems) { 
     this.iditems = iditems; 
    } 

    public Categories getCategories() { 
     return categories; 
    } 

    public void setCategories(Categories categories) { 
     this.categories = categories; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public double getPriceInCents() { 
     return priceInCents; 
    } 

    public void setPriceInCents(double priceInCents) { 
     this.priceInCents = priceInCents; 
    } 

    public int isHidden() { 
     return hidden; 
    } 

    public void setHidden(int hidden) { 
     this.hidden = hidden; 
    } 

    public Set<Extrascat> getExtrascat() { 
     return extrascat; 
    } 

    public void setExtrascat(Set<Extrascat> extrascat) { 
     this.extrascat = extrascat; 
    } 

    public int getHidden() { 
     return hidden; 
    } 

} 

Itemsextrascat.java

@Entity 
@Table(name = "itemsextrascat") 
public class Itemsextrascat implements Serializable { 
    private static final long serialVersionUID = 7640244484584804821L; 

    @Id 
    @GeneratedValue 
    private int iditemsextrascat; 

    @ManyToOne 
    @JoinColumn(name = "iditems") 
    private Items items; 

    @ManyToOne 
    @JoinColumn(name = "idextrascat") 
    private Extrascat extrascat; 

    // CONSTRUCTORS 
    public Itemsextrascat() { 

    } 

    public Itemsextrascat(int iditemsextrascat, Items items, Extrascat extrascat) { 
     this.iditemsextrascat = iditemsextrascat; 
     this.items = items; 
     this.extrascat = extrascat; 
    } 

    // GETTERS AND SETTERS 
    public int getIditemsextrascat() { 
     return iditemsextrascat; 
    } 

    public void setIditemsextrascat(int iditemsextrascat) { 
     this.iditemsextrascat = iditemsextrascat; 
    } 

    public Items getItems() { 
     return items; 
    } 

    public void setItems(Items items) { 
     this.items = items; 
    } 

    public Extrascat getExtrascat() { 
     return extrascat; 
    } 

    public void setExtrascat(Extrascat extrascat) { 
     this.extrascat = extrascat; 
    } 

} 

Extras.java

@Entity 
@Table(name = "extras") 
public class Extras implements Serializable { 

    private static final long serialVersionUID = 8644201177004602944L; 

    @Id 
    private int idextras; 
    private String name; 
    private double priceincents; 

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "idextrascat") 
    private Extrascat extrascat; 

    @ManyToMany(cascade = { CascadeType.ALL }, mappedBy = "extras") 
    private Set<Orderitem> orderitem = new HashSet<Orderitem>(); 

    // CONSTRUCTORS 
    public Extras() { 

    } 

    public Extras(int idextras, String name, double priceincents, Extrascat extrascat) { 
     this.idextras = idextras; 
     this.name = name; 
     this.priceincents = priceincents; 
     this.extrascat = extrascat; 
    } 

    // GETTERS AND SETTERS 
    public int getIdextras() { 
     return idextras; 
    } 

    public void setIdextras(int idextras) { 
     this.idextras = idextras; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public double getPriceincents() { 
     return priceincents; 
    } 

    public void setPriceincents(double priceincents) { 
     this.priceincents = priceincents; 
    } 

    public Extrascat getExtrascat() { 
     return extrascat; 
    } 

    public void setExtrascat(Extrascat extrascat) { 
     this.extrascat = extrascat; 
    } 
} 
+0

我應該刪除itemsextrascat.java以及服務和Dao,並且查詢c:foreach – Marios

+0

的其中一個項目或額外項目爲UI創建不同bean的良好實踐。實體bean用於後端邏輯處理。 –

+0

首先生成有效的HTML。您不能在tr內直接顯示文本。在tr中包含第三個模糊,在td中也包含。測試必須在th或td內,但不能直接在tr中。不要對兩個不同的東西使用相同的變量名稱(itemsextrascat)。不要使用複數形式(演員,項目等)來指代單個事物(一個額外的)。 –

回答

0

Zaki建議爲UI創建一個新bean是正確的。我正在查詢一張表,並希望從多個表中獲得結果。相反,我填充一個新的對象,該對象擁有我需要的值並在我的視圖中使用該對象。