ZooApp右鍵專案 → New → Persistence → Persistence Unit
jdbc/sample (內建 Java DB)@Entity
public class Animal implements Serializable {
@Id @GeneratedValue
private Long id;
@Column(name="animalName") // 自定義欄位名
private String name;
private String kind;
private String weight;
@ManyToOne
private Pavilion pavilion; // 多對一關聯
// Getter/Setter (透過 Refactor → Encapsulate Fields 自動產生)
}
@Entity
public class Pavilion implements Serializable {
@Id @GeneratedValue
private Long id;
@Column(name="pavilionName")
private String name;
private String address;
@OneToMany(mappedBy="pavilion") // 一對多雙向關聯
private Collection<Animal> animals;
// equals/hashCode 必須正確實作 (JSF 下拉選單需求)
public int hashCode() { return id != null ? id.hashCode() : 0; }
public boolean equals(Object obj) {
if (!(obj instanceof Pavilion)) return false;
Pavilion other = (Pavilion) obj;
return id != null && id.equals(other.id);
}
}
entity (生成 Managed Bean、Converter、Controller)| 技術點 | 說明 |
|---|---|
| @Column(name="...") | 覆寫預設欄位命名策略 (屬性名 → 欄位名) |
| @ManyToOne / @OneToMany | 雙向關聯必須指定 mappedBy 指向擁有端 |
| Table Generation: Create | 僅適用開發階段,生產環境改用 Update 或手動 DDL |
| TopLink Provider | GlassFish 內建 JPA 實作,後續版本改為 EclipseLink |
| jdbc/sample | Application Server 內建 Java DB (Derby) 連線池 |
# 1. 啟動資料庫
Tools → Java DB Database → Start Java DB Server
# 2. 執行專案
右鍵專案 → Run Project
# 3. 瀏覽器自動開啟
https://localhost:8080/ZooApp/ → 顯示 Animal/Pavilion 管理介面
| 問題 | 原因 | 解決 |
|---|---|---|
| 部署失敗:Table already exists | Table Generation: Create 重複部署 | 清除資料庫或改用 Update 策略 |
| 下拉選單顯示 Object@hash | Pavilion 缺少 toString()/equals/hashCode | 實作 equals/hashCode 基於 ID |
| LazyInitializationException | JSF 頁面存取 LAZY 關聯但 Session 已關閉 | 使用 <f:view> 延長 Session 或 EAGER 載入 |
| 資料庫鎖死 | Derby 單一連線池並發衝突 | 調整連線池大小、使用獨立資料庫 |
透過 NetBeans 強大的代碼生成與視覺化工具,配合 Java EE 5 標準規格 (EJB 3, JPA, JSF),開發者可在數分鐘內建立功能完整的企業級 CRUD 應用原型,大幅縮短開發週期。