本系列兩篇文章示範在 NetBeans IDE 6.0 Visual Web 工具中使用 JPA(Java Persistence API)開發資料庫應用。本文(上)涵蓋環境建置、實體類生成、持久單元配置、Visual Web 專案與 Java SE 專案整合、Table 組件綁定實體陣列。下文將示範 CRUD 操作實作。
EntityManager 統一持久化操作
create table "APP"."USERS" (
userName VARCHAR(50),
password VARCHAR(12),
email_address VARCHAR(50),
user_id INTEGER GENERATED ALWAYS AS IDENTITY
);
alter table Users add constraint usersPK PRIMARY KEY (user_id);
INSERT INTO Users VALUES ('Joe', 'joepw', 'joe@email.com', DEFAULT);
INSERT INTO Users VALUES ('Sarah', 'mypassword', 'sarah@sun.com', DEFAULT);
INSERT INTO Users VALUES ('Jane Doe', 'janie', 'jane@hotmail.com', DEFAULT);
關鍵:GENERATED ALWAYS AS IDENTITY 讓 Derby 自動生成遞增主鍵。手動 INSERT 時主鍵欄位用 DEFAULT 關鍵字。
TestModelAppcom.samples.modelcom.samples.model.MainTestWebAppcom.samples.webTestWebApp 右鍵 → Properties → Libraries → Add Project → 選擇 TestModelApp → Add Project JAR Files。使 Web 專案可存取 Model 專案的實體類與控制器。
TestModelApp 專案右鍵 → New → Entity Classes from Database → 選擇 Sample 資料庫連線 → 選取 USERS 表 → 下一步。
samplePURESOURCE_LOCALoracle.toplink.essentials.PersistenceProvider(TopLink Essentials)persistence.xml 於 META-INF雙擊開啟設計視圖,確認:資料庫 URL、驅動程式、用戶名/密碼、管理類別 com.samples.model.Users、密碼欄位正確填寫。
生成的 Users.java 需手動加上主鍵生成註解:
@Entity
public class Users implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 關鍵:Derby IDENTITY 策略
@Column(name = "USER_ID", nullable = false)
private Integer userId;
// ... 其他欄位
}
使用 Fix Imports(Alt+Shift+I)自動匯入 javax.persistence.GeneratedValue 與 GenerationType。
注意:MySQL 使用 auto_increment 時通常不需指定策略,Hibernate 預設即可處理。
於 com.samples.model 建立 UserController:
public class UserController {
private EntityManagerFactory emf;
private EntityManager getEntityManager() {
if (emf == null) {
emf = Persistence.createEntityManagerFactory("samplePU");
}
return emf.createEntityManager();
}
public Users[] getUsers() {
EntityManager em = getEntityManager();
try {
Query q = em.createQuery("select c from Users as c");
return (Users[]) q.getResultList().toArray(new Users[0]);
} finally {
em.close();
}
}
}
Fix Imports 匯入 EntityManager、EntityManagerFactory、Persistence。
private Users[] users;
public Users[] getUsers() { return users; }
public void setUsers(Users[] users) { this.users = users; }
public void updateUsers() {
UserController uc = new UserController();
users = uc.getUsers();
}
public void init() {
super.init();
try { _init(); } catch (Exception e) { /* 錯誤處理 */ }
updateUsers(); // 關鍵:初始化時載入資料
}
users (SessionBean1)右鍵 TestWebApp → Run。瀏覽器顯示 Table 組件,資料來自 Users 表三筆測試資料。
| 技術點 | 說明 |
|---|---|
| Java SE + Web 專案分離 | 實體與持久邏輯獨立於 Web 層,利於重用與測試 |
| persistence.xml | JPA 必備配置,定義持久單元、資料來源、管理類別 |
| @GeneratedValue(IDENTITY) | Derby 主鍵自增策略,必須在實體類手動標註 |
| EntityManager 生命週期 | 每次操作建立關閉,避免長期持有導致連線洩漏 |
| Visual Web 綁定 | 無需 ObjectListDataProvider,直接綁定實體陣列/列表 |
將示範如何使用 JPA 實作新增、修改、刪除操作,並介紹 Grid Panel 版面控制技巧。