首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP 頁面新增多個物件:List 封裝 + Hibernate 一對多映射

     編輯:程式設計綜合問答

場景

一行對應一個物件,物件數量由另一張表記錄筆數決定,物件內部還引用其他物件(巢狀結構)。

標準做法:Controller/Servlet 準備 List → JSP 迭代渲染

// Servlet / Controller
List parents = new ArrayList<>();
for (ChildRecord rec : childTableRecords) {
    Parent p = new Parent();
    p.setId(rec.getId());
    p.setName(rec.getName());
    // 關聯子物件
    p.setChild(new Child(rec.getChildId(), rec.getChildName()));
    parents.add(p);
}
request.setAttribute("parents", parents);
request.getRequestDispatcher("/show.jsp").forward(req, resp);

<c:forEach items="${parents}" var="p">
  <tr>
    <td>${p.id}</td>
    <td>${p.name}</td>
    <td>${p.child.name}</td> <!-- 直接存取關聯物件 -->
  </tr>
</c:forEach>

Hibernate 映射關鍵:@OneToMany / @ManyToOne

@Entity
public class Parent {
    @Id @GeneratedValue Long id;
    String name;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List children = new ArrayList<>();
    // getter/setter
}

@Entity
public class Child {
    @Id @GeneratedValue Long id;
    String name;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

注意事項

  • Session 生命週期:若 JSP 中存取 `p.child.name` 觸發延遲載入,需確保 Hibernate Session 仍開啟(`OpenSessionInViewFilter` / `OpenSessionInViewInterceptor`),否則會拋 `LazyInitializationException`。
  • N+1 查詢問題:列表頁大量存取關聯物件時,啟用 `@BatchSize` 或在 Service 層 `JOIN FETCH` 預載:
    `FROM Parent p LEFT JOIN FETCH p.children`
  • JSON 序列化:若改為 AJAX 回傳 JSON,需處理雙向引用循環(`@JsonManagedReference` / `@JsonBackReference` 或 DTO 轉換)。

總結

JSP 顯示多物件:後端裝 List 放入 request/session → JSTL forEach 迭代 → EL 表達式存取巢狀屬性。Hibernate 映射加 `@OneToMany`,注意 Session 生命週期與 N+1 查詢優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved