corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

在 Visual Web 应用程åºä¸­ä½¿ç”¨ Java Persistence API

2007 å¹´ 12 月 [修订å·ï¼šV6.0]    

借助 NetBeans IDE 6.0 å’Œ Visual Web 工具,您å¯ä»¥ä½¿ç”¨ Visual Web æ•°æ®æä¾›ç¨‹åºç»„ä»¶ä»¥åŠ Java Persistence API(JPA)æ¥ç¼–写连接到数æ®åº“表的应用程åºã€‚建立了到数æ®åº“表的连接之åŽï¼Œå¯ä»¥ä½¿ç”¨ Java Persistence API 执行数æ®åº“ CRUD æ“作(å³åˆ›å»ºã€è¯»å–ã€æ›´æ–°å’Œåˆ é™¤æ“作)。在开å‘基于数æ®åº“çš„åº”ç”¨ç¨‹åºæ—¶ï¼Œä½¿ç”¨ Java Persistence API 能æä¾›æ›´é«˜çš„çµæ´»æ€§ã€‚

本文是本系列文章的第 1 篇(共两篇),主è¦ä»‹ç»åœ¨ Visual Web 应用程åºä¸­ä½¿ç”¨ Java Persistence API 所需的设置步骤。您将了解如何使用此 API 连接或绑定到数æ®åº“表,从而能够访问表中的数æ®ã€‚在第 2 篇文章(“使用 Java Persistence API 修改数æ®åº“表行”)中,您将了解如何使用此 API æ·»åŠ ã€æ›´æ–°å’Œåˆ é™¤æ•°æ®åº“表行。此外,本文还æä¾›äº†ä¸€äº›æŠ€å·§ï¼Œå¯ä»¥æœ€å¤§é™åº¦åœ°åˆ©ç”¨ NetBeans IDE åŠå…¶å¯è§†çš„ web 函数。

目录

Content on this page applies to NetBeans IDE 6.0

本文所使用的外部代ç 

无。
 

本文将使用以下技术和资æº

JavaServer Faces 组件/
Java EE å¹³å°
ä¸éœ€è¦1.2/Java EE 5*
Travel æ•°æ®åº“
ä¸éœ€è¦

* è¦åˆ©ç”¨ NetBeans IDE 6.0 çš„ Java EE 5 功能,我们需è¦ä½¿ç”¨ä¸€ä¸ªä¸Ž Java EE 5 规范完全兼容的应用æœåŠ¡å™¨ï¼Œæ¯”å¦‚è¯´ Sun Java Application Server 9/GlassFish。

本文专门适用于 Sun Java Application Server PE 9.0 Update Release 1 å’Œ Tomcat 6.0.14。如果您使用的是其他æœåŠ¡å™¨ï¼Œè¯·å‚考 å‘行说明 å’Œ 常è§é—®é¢˜è§£ç­” 了解已知问题和解决方法。有关支æŒçš„æœåŠ¡å™¨å’Œ Java EE å¹³å°çš„详细信æ¯ï¼Œè¯·å‚阅 å‘行说明。

概述

本文(本系列的第 1 篇文章)首先介ç»äº†å¦‚何将 NetBeans IDE Visual Web Table 组件直接绑定到一个 Object æ•°ç»„æˆ–åˆ—è¡¨ï¼ˆä»¥åŠ POJO 或 Plain Old Java Object)。对使用 Visual Web 工具访问数æ®åº“表很熟悉的开å‘äººå‘˜ä¸€å®šä½¿ç”¨è¿‡æ•°æ®æä¾›è€…ç»„ä»¶ã€‚æ‚¨ä¹Ÿè®¸å·²å°†ä¸€ä¸ª Table 组件从 Palette 移动到一个页é¢ä¸Šï¼Œç„¶åŽå°†æ­¤é¡µé¢ä¸Šçš„æ•°æ®åº“表移动到 Table 组件上。当将数æ®åº“表移动到页é¢ä¸Šæ—¶ï¼ŒVisual Web å·¥å…·ä¼šä¸ºæ‚¨åˆ›å»ºä¸€ä¸ªæ•°æ®æä¾›è€…ç»„ä»¶ï¼Œè¿™ä¸ªæ•°æ®æä¾›è€…å¤„ç†æ•°æ®åº“绑定和数æ®è®¿é—®ã€‚

现在è¦å°†åŒä¸€ä¸ª Visual Web Table 组件绑定到数æ®åº“表,而ä¸éœ€è¦æ•°æ®æä¾›è€…支æŒï¼›ä½¿ç”¨ Java Persistence API æ¥è¿›è¡Œç»‘定。使用 JPA,å¯ä»¥èŽ·å¾—æ•°æ®åº“表数æ®å¹¶å½“作实体 bean 列表或数组,然åŽç›´æŽ¥å°†æ•°æ®ç»‘定到 Visual Web Table 组件,无需使用 ObjectListDataProvider 或 ObjectArrayDataProvider。然åŽå¯ä»¥ä½¿ç”¨ Visual Web Table 组件功能æ“作该数æ®ã€‚

除了讨论 Java Persistence API 的使用之外,我们还è¦è®¨è®º NetBeans IDE 的一些特性。我们将介ç»å¦‚何使用 IDE 实现以下功能:

创建数æ®åº“表ã€åˆ—和键 将一个 Visual Web 项目链接到一个标准 Java SE 项目,以使 web 项目能够使用 Java SE 项目中的类。 定义一个æŒä¹…å•元,作为任何 JPA 应用程åºçš„强制é…置文件。 通过数æ®åº“表生æˆå®žä½“ç±» 使用 Java æºä»£ç ç¼–辑函数æ¥ç”Ÿæˆä»£ç ã€ä¿®å¤é—失的导入语å¥ï¼Œä»¥åŠé‡æ–°æ ¼å¼åŒ–ä»£ç  å°†å±žæ€§ç»‘å®šåˆ°æ•°æ®

åŽç»­æ–‡ç« å°†å±•示如何使用指定 Visual Web 组件(比如 Grid Panel)控制页é¢å¸ƒå±€ã€‚

为何使用 Java Persistence API

Java Persistence API(在 Java EE 5 å¹³å°ä¸­å¼•入)å¯ç”¨äºŽåƒ web åº”ç”¨ç¨‹åºæˆ– EJB 这样的ä¼ä¸šåº”用程åºå’Œå®ƒä»¬çš„部署到 Java EE 5 环境(如 GlassFish)或者)或 Java EE å¹³å°å¤–部的远程客户机。如果选择 Java Persistence API,å¯ä»¥ä½¿ç”¨ JPA 让应用程åºç»•过 Visual Web æ•°æ®æä¾›è€…ç»„ä»¶ç›´æŽ¥ä¸Žåº•å±‚æ•°æ®åº“通信。

使用 Java Persistence API 有许多好处。第一,JPA 是一个简å•且轻é‡åž‹çš„编程模型,其中 POJO(plain old Java object)是“一类居民”。

将实体对象作为 POJO 处ç†å¯ä»¥å¼•起使用 Java Persistence API 的其他好处。由于实体是 POJO,一个实体类å¯ä»¥æ‰©å±•å¦ä¸€ä¸ªå®žä½“类或éžå®žä½“类,一个éžå®žä½“类也å¯ä»¥å¯ä»¥æ‰©å±•实体类。作为 POJO,实体类å¯ä»¥è¢«åºåˆ—化并通过网络å‘é€åˆ°å…¶ä»–地å€ç©ºé—´ï¼Œä¹Ÿå¯ä»¥ç”¨äºŽä¸æ”¯æŒæŒä¹…性的环境中。从而无需使用任何特定的数æ®è½¬æ¢å¯¹è±¡å°†å®žä½“å‘é€åˆ°è¿œç¨‹ä½ç½®ã€‚

借助 Java Persistence API,å¯ä»¥ä½¿ç”¨æ ‡å‡†åº”用程åºç¼–ç¨‹æŽ¥å£æ¥æ‰§è¡Œä¸Žå®žä½“相关的典型数æ®åº“æ“作(Create/Read/Update/Delete 或 CRUD æ“作)。还改善了应用程åºçš„å¯ç§»æ¤æ€§ã€‚由于第三方æŒä¹…æä¾›è€…更容易为数æ®åº“ç³»ç»Ÿå¼€å‘æˆ–æä¾›æ’件,所以ä¸ç”¨è€ƒè™‘应用程åºçš„å¯ç§»æ¤æ€§å°±å¯ä»¥å°†ä¸åŒçš„ Java EE 容器与ä¸åŒçš„系统组åˆèµ·æ¥ã€‚

å¦å¤–,å¯ä»¥ä½¿ç”¨åº•层数æ®åº“çš„æœ¬æœºæŸ¥è¯¢è¯­è¨€æ¥æ‰§è¡ŒæŸ¥è¯¢ã€‚而且,也简化了使用 Java Persistence API 的实体打包规则。如果应用程åºå…·æœ‰è¾ƒé«˜çš„事务性需求,那么使用 JPA 也许更好,因为它支æŒä¹è§‚é”定(也就是说,它é¿å…了会影å“到性能的é”定),但是与其他用户的冲çªå¯èƒ½ä¼šå¼•起一些事务的失败。

关于 Java Persistence API 的更多信æ¯ï¼Œè¯·å‚阅文章 “Java Persistence API:一个更简å•的实体æŒä¹…性编程模型”。

关于 Java Persistence API 的深入指导,请å‚阅文章 在桌é¢åº”用程åºä¸­ä½¿ç”¨æŒä¹…性 API。

创建数æ®åº“表

ä»¥ä¸‹çš„é€æ­¥æŒ‡å¯¼å‡è®¾æ‚¨å·²ç»è®¾ç½®äº†ä¸€ä¸ªå«åš sample 的数æ®åº“,其中包括一个å«åš Users 的数æ®åº“表。 Users 表应该有 4 列,如下:

user_id - 主键;类型:整型 userName - 类型:字符串 password - 类型:字符串 email_address - 类型:字符串

执行 SQL 语å¥

å¯ä»¥ä½¿ç”¨ Services 窗å£ä¸­çš„ Databases 节点将 Users 表添加到 sample Derby æ•°æ®åº“。å¯ä»¥ä»Žä¸€ä¸ªæ–‡ä»¶æ‰§è¡Œ SQL 脚本创建此表或者å•独执行æ¯è¡Œ SQL 代ç ã€‚Services 窗å£ï¼ˆä»¥å‰ç§°ä½œ Runtime 窗å£ï¼‰ä¸­çš„æ•°æ®åº“表节点上下文èœå•函数包括用于创建新表和执行 SQL 代ç çš„函数。

SQL 执行命令
图 1:SQL 执行命令

 

Execute Command 功能打开一个 Editor 窗å£ï¼Œå¯ä»¥å‘其中输入一行或多行 SQL 代ç ã€‚å•击 Run 按钮执行窗å£çš„å†…å®¹ã€‚è¯·ç¡®ä¿ Connection 字段指示您已连接到 sample æ•°æ®åº“。

创建 Users 表的 SQL 代ç 
图 2: 创建 Users 表的 SQL 代ç 

定义主键值

å¯ä»¥ä½¿ç”¨ä»¥ä¸‹ä»£ç åœ¨ Derby sample æ•°æ®åº“中创建 Users 表。注æ„å­å¥ GENERATED ALWAYS AS IDENTITY 指示 Derby DBMS å°†ç”Ÿæˆ user_id ä¸»é”®å€¼ï¼Œå¹¶ä¸”å½“æ·»åŠ ä¸€ä¸ªæ–°çºªå½•æ—¶è¯¥ä¸»é”®å€¼è‡ªåŠ¨é€’å¢žã€‚å¦‚æžœå‘æ­¤è¡¨ä¸­æ‰‹åŠ¨æ·»åŠ è®°å½•ï¼Œæ¯”å¦‚ä½¿ç”¨ INSERT INTO 代ç ï¼Œè¯·ç¡®ä¿ä½¿ç”¨ä¿ç•™å­— DEFAULT æ¥æŒ‡ç¤º user_id 的值是由数æ®åº“æä¾›çš„。

代ç ç¤ºä¾‹ 1:创建 Users 表的 SQL 代ç 
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);
               

还有使用 Derby 定义主键值的其他方法。除了 Apache Derby 站点 上的 Derby Reference Manual 之外,还å¯ä»¥å‚考 Brian Leonard 撰写的关于此项目的 åšå®¢æ–‡ç« ã€‚

但是请记ä½ï¼Œä¸åŒçš„æ•°æ®åº“管ç†ç³»ç»Ÿå¤„ç†ä¸»é”®å€¼çš„æ–¹å¼ä¹Ÿä¸åŒã€‚例如,对于 MySQL,用于生æˆå’Œè‡ªåŠ¨é€’å¢žä¸»é”®çš„è¡¨å®šä¹‰ä¸ºï¼š

`user_id` int(10) unsigned NOT NULL auto_increment, ...

ç„¶åŽï¼Œå°†ä»Žæ­¤æ•°æ®åº“表定义生æˆä¸€ä¸ªå®žä½“类。生æˆçš„实体类是数æ®åº“表的 Java Persistence 表示。因为 TopLink 是 JPA çš„å‚考实现,å¯ä»¥å‚考 TopLink 文档 获得关于 id 生æˆçš„æ›´å¤šä¿¡æ¯ã€‚使用 Derby,必须å‘生æˆçš„类手动添加注释,以对主键指示生æˆçš„值策略(@GeneratedValue))。使用 MySQL,无需在此实体类中指定生æˆçš„值策略。

将 Visual Web 项目链接到 Java Standard Edition 项目

è¦ä½¿ç”¨ Visual Web 应用程åºçš„ Java Persistence API,实际上还需è¦åˆ›å»ºä¸¤ä¸ªé¡¹ç›®ã€‚第一个是 Visual Web 项目。å¦ä¸€ä¸ªæ˜¯ Java Standard Edition (SE) 应用程åºé¡¹ç›®ï¼ŒåŒ…括 web 应用程åºå°†è¦è°ƒç”¨å…¶ä»£ç çš„一些类。从该 Java SE 应用程åºé¡¹ç›®ä¸­ç”Ÿæˆä¸€ä¸ªæŒä¹…å•元,以获得 Java Persistence API çš„ä¸€ä¸ªå¥æŸ„。web 应用程åºç„¶åŽä½¿ç”¨åœ¨ Java SE 应用程åºé¡¹ç›®ä¸­åˆ›å»ºçš„类建立数æ®åº“绑定,éšåŽæ‰§è¡Œæ•°æ®åº“æ›´æ–°ã€åˆ é™¤å’Œæ·»åŠ æ“作。

 

创建项目

创建 Java SE 应用程åºé¡¹ç›®ã€‚首先创建 Java SE 应用程åºé¡¹ç›®ï¼Œè¿™æ˜¯ä¸€ä¸ªæ™®é€šçš„ Java 项目。å•击工具æ ä¸Šçš„ New Project 图标(Ctrl+Shift+N),然åŽåœ¨ Categories 列表中选择 Java,在 Project 列表中选择 Java Application。然åŽå•击 Next 按钮。
创建 Java 应用程åº
图 3: 创建 Java 应用程åºï¼ˆå•击放大图åƒï¼‰
在 New Java Application 窗å£ä¸­ï¼Œå°†é¡¹ç›®å称设置为 TestModelApp。还需è¦å°†åŒ…设置为 com.samples.model。å¯ä»¥é€šè¿‡å°†é»˜è®¤çš„ Create Main Class æ¡ç›®ç”± textmodelapp.Main 更改为 com.samples.model.Main æ¥å®žçŽ°ã€‚å•击 Finish 按钮。
设置项目和包åç§°
图 4: 设置项目和包å称(å•击放大图åƒï¼‰
创建 Visual Web 项目。在 New Project å¯¹è¯æ¡†ä¸­é€‰æ‹© Web 类别,并选择 Web Application 项目,然åŽå•击 Next 按钮。
创建 Web 项目
图 5:创建 Web 项目(å•击放大图åƒï¼‰
在 New Web Application å¯¹è¯æ¡†ä¸­ï¼Œå°†é¡¹ç›®å称设置为 TestWebApp。项目ä½ç½®åº”该默认与 TestModelApp 项目ä½ç½®ç›¸åŒã€‚å•击 Next 按钮转到下一å±å¹•,在其中选择框架。
选择 Web 应用程åºçš„类型
图 6: 设置 Web 项目åç§°å’Œä½ç½®ï¼ˆå•击放大图åƒï¼‰
为框架选择 Visual Web JavaServer Faces。当这样选择时,å±å¹•显示é…置设置。将 Default Java Package 设置由 testwebapp 更改为 com.samples.web。完æˆè¿™ä¸€æ­¥ä¹‹åŽï¼ŒTestModelApp å’Œ TestWebApp 会作为节点出现在 Project 窗å£ä¸­ã€‚å•击 Finish 按钮。
设置 Web åº”ç”¨ç¨‹åºæ¡†æž¶
图 7: 设置 Web åº”ç”¨ç¨‹åºæ¡†æž¶å’ŒåŒ…

将项目链接起æ¥

现在需è¦å°†ä¸¤ä¸ªé¡¹ç›®é“¾æŽ¥èµ·æ¥ã€‚具体æ¥è¯´ï¼Œéœ€è¦è®© TestModelApp 作为 TestWebApp 项目的ä¾èµ–项。è¦å°† TestModelApp 作为 TestWebApp çš„ä¾èµ–项目,需è¦å°† TestModelApp.jar 文件添加到 TestWebApp é¡¹ç›®ã€‚ä¸‹é¢æ˜¯æ“作方法:

在 Projects 窗å£ä¸­å³é”®å•击 TestWebApp 项目节点,然åŽä»Žä¸Šä¸‹æ–‡èœå•中选择 Properties 选项。 在 Project Properties å¯¹è¯æ¡†ä¸­ï¼Œåœ¨å·¦ä¾§çš„ Categories 部分å•击 Libraries 节点。然åŽï¼Œå•击 Add Project 按钮。
添加项目库
图 8: 添加编译时库(å•击放大图åƒï¼‰
在 Add Project 窗å£ï¼Œæµè§ˆåˆ° TestModelApp 项目的ä½ç½®ç„¶åŽé€‰æ‹©å®ƒã€‚ç„¶åŽï¼Œå•击 Add Project JAR Files 按钮。此步骤将 TestModelApp jar 文件添加到 TestWebApp 项目的è¿è¡Œæ—¶åº“中,而且 TestModelApp 会出现在 Project Properties å±å¹•中。å•击 Project Properties å±å¹•中的 OK æŒ‰é’®ï¼Œå®Œæˆæ­¤è¿‡ç¨‹ã€‚
添加 Project JAR 文件
图 9: 添加 JAR 文件(å•击放大图åƒï¼‰

绑定数æ®åº“表

使用 Java Persistence API 在数æ®åº“表和 Visual Web JSF 应用程åºä¸­ä½¿ç”¨çš„表å¯è§†åŒ–组件之间传递信æ¯ã€‚进行此绑定åŽï¼Œä½¿ç”¨ API èŽ·å–æ•°æ®åº“表的行,但是使用 Visual Web Table 组件的内置显示功能显示数æ®ã€‚

连接到数æ®åº“

开始之å‰ï¼Œéœ€è¦å°†æ•°æ®åº“连接到 TestWebApp 项目中的 Users 表。如果使用示例 Derby æ•°æ®åº“而且还没有与之连接,那么打开 Services 窗å£ï¼Œå±•å¼€ Databases 节点,打开 jdbc:derby://localhost:1527/sample [app on APP] 节点的上下文èœå•并选择 Connect。如果使用ä¸åŒçš„ DBMS,那么如果需è¦ï¼Œå¯ä»¥ä¸ºæ•°æ®åº“设置一个驱动程åºï¼Œå¹¶æ ¹æ®å¿…é¡»çš„è¿žæŽ¥å‚æ•°åˆ›å»ºä¸€ä¸ªæ–°è¿žæŽ¥ã€‚(如果将数æ®åº“å称作为示例,将会更加容易执行剩下的步骤)。

如果还未创建 Users 表,那么现在是时候创建了:å‚阅 创建数æ®åº“表。

在 Services 窗å£éªŒè¯åˆ°æ•°æ®åº“的连接是å¦å»ºç«‹ã€‚打开 Databases > sample database Tables èŠ‚ç‚¹å¹¶éªŒè¯ Users è¡¨æ˜¯å¦æ­£ç¡®ã€‚

创建表示 Users æ•°æ®åº“表的 Java æŒä¹…实体类

创建一个表示 Users 表的实体类。正如å‰é¢æåˆ°çš„,实体类是数æ®åº“表定义的 Java Persistence 表示。JPA 使用 Java 语言注释功能将 POJO 标记为带有对象关系映射信æ¯çš„ JPA 实体。使用 Entity Classes from Database 函数在 TestModelApp 中创建实体类。

在 Projects(或 Files)窗å£ä¸­å³é”®å•击 TestModelApp 项目。从上下文èœå•中选择 New > Entity Classes from Database 选项。 此时将显示 New Entity Classes from Database Database Tables å¯¹è¯æ¡†ã€‚如果 Database Connection 字段是空的,则从下拉列表中选择示例数æ®åº“。Available Tables 列显示示例数æ®åº“中的所有表,包括 Users 表。选择 USERS 表并å•击 按钮Add å°† Users 移动到 Selected Tables 列。移动 Users 表åŽå•击 Next 按钮。
通过数æ®åº“表创建实体类
图 10: 为实体类选择数æ®åº“表(å•击放大图åƒï¼‰
此时将出现 Entity Classes å¯¹è¯æ¡†ã€‚IDE 显示数æ®åº“表åç§° Users,并建议一个类å Users。(如果需è¦ï¼ŒåŒå‡»ç±»åè¿›è¡Œæ›´æ”¹ï¼‰ã€‚å¯¹è¯æ¡†è¿˜æŒ‡ç¤ºåŒ…为 com.samples.model。å•击 Create Persistence Unit 按钮。
创建æŒä¹…å•å…ƒ
图 11: 创建æŒä¹…å•元(å•å‡»å›¾åƒæ”¾å¤§ï¼‰

创建æŒä¹…å•å…ƒ

在 Create Persistence Unit å¯¹è¯æ¡†ä¸­ï¼Œå°† Persistence Unit Name 设置为 samplePU。ä¿ç•™å…¶ä»–字段的默认值。å•击 Create 按钮,然åŽåœ¨ Entity Classes å±å¹•中å•击 Finish æŒ‰é’®å®Œæˆæ“作并创建 samplePU æŒä¹…å•元。
为æŒä¹…å•元命å
图 12: 为æŒä¹…å•元命å
éªŒè¯æŒä¹…å•å…ƒæ˜¯å¦æ­£ç¡®åˆ›å»ºï¼Œè¿™æ˜¯ä¸€ä¸ªä¸é”™çš„æƒ³æ³•。为此,展开 TestModelApp Source Packages > META-INF 节点并åŒå‡» persistence.xml 文件。Design 窗å£å°†æ˜¾ç¤ºå…³äºŽæŒä¹…å•元的信æ¯ï¼Œè€Œ Navigator 窗å£å°†æ˜¾ç¤º XML 属性。
打开 persistence.xml 文件查看æŒä¹…çš„å•å…ƒ
图 13: éªŒè¯æŒä¹…å•元(å•击放大图åƒï¼‰
å•击 XML 标签查看完整的 XML 清å•。文件中的属性应该正确å射到数æ®åº“åç§°ã€urlã€é©±åŠ¨ç¨‹åºã€å¯†ç ï¼Œä»¥åŠåŒ…和类å(com.samples.model.Users)。事务类型为 RESOURCE_LOCAL,æä¾›è€…为 oracle.toplink.essentials.PersistenceProvider。é‡ç‚¹æ³¨æ„ï¼šç¡®ä¿æ­£ç¡®å¡«å†™äº†å¯†ç å­—段。
æŒä¹…å•å…ƒ XML
图 14: æŒä¹…å•å…ƒ XML 定义(å•击放大图åƒï¼‰

使用 JPA 设置键属性

如果使用的是 Derby æ•°æ®åº“,需è¦å¯¹ç”Ÿæˆçš„ Users.java 代ç è¿›è¡Œä¸€äº›ä¿®æ”¹ï¼Œä»¥å¤„ç†ä¸»é”®å€¼çš„自动生æˆã€‚但是,其他数æ®åº“系统å¯ä»¥ä»¥ä¸åŒçš„æ–¹å¼å¤„ç†ä¸»é”®å€¼ç”Ÿæˆï¼Œå¯¹ç”Ÿæˆçš„ Users.java 类所åšçš„任何修改都必须与底层数æ®åº“的主键生æˆç­–略匹é…。

@Id 和 @GeneratedValue 注释

创建 Users 实体类之åŽï¼Œéœ€è¦ä¿®æ”¹è¯¥ç±»ï¼Œä»¥ä¾¿è®©æ•°æ®åº“自动生æˆä¸»é”®å­—段(用户 id 字段)。JPA 使用 @Id 注释标识主键。å‘主键添加第二个注释,指示生æˆä¸»é”®å€¼çš„策略:@GeneratedValue(strategy=GenerationType.<...>),其中策略å­å¥æ˜¯å¯é€‰çš„。注æ„,选择的生æˆç­–略必须与数æ®åº“的性能相关è”。

使用 Derby æ•°æ®åº“生æˆä¸»é”®å€¼

因为 Derby æ•°æ®åº“æ”¯æŒ IDENTITY 列类型,因此å¯ä»¥ä¸ºä¸»é”®ç”Ÿæˆä¸€ä¸ªæƒŸä¸€å€¼ï¼Œè¿™ä¸ªä»»åŠ¡å¯ä»¥ç”±æ•°æ®åº“æ¥å®Œæˆã€‚因此,å‘主键定义中添加以下代ç è¡Œï¼š@GeneratedValue(strategy = GenerationType.IDENTITY).

进行修改之åŽï¼Œå®šä¹‰è¡¨çš„ Users.java 代ç åº”该如下所示:

代ç ç¤ºä¾‹ 1:ç»è¿‡ä¿®æ”¹çš„ Users.java ç±»
public class Users implements Serializable {
  @Column(name = "USERNAME")
  private String username;
  @Column(name = "PASSWORD")
  private String password;
  @Column(name = "EMAIL_ADDRESS")
  private String emailAddress;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "USER_ID", nullable = false)
  private Integer userId;
               ...

 

使用 Fix Imports 功能

æ³¨æ„ @GeneratedValue 标记需è¦ä¸¤ä¸ªç±»ï¼šjavax.persistence.GeneratedValue å’Œ javax.persistence.GenerationType。使用 Fix Imports 函数导入这些类。å³é”®å•击æºä»£ç ç¼–辑窗å£çš„任何地方,并从弹出èœå•选择 Fix Imports。Fix Imports å‡½æ•°å°†è¿™ä¸¤ä¸ªå¯¼å…¥è¯­å¥æ·»åŠ åˆ°ç±»ï¼š

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

æ­£å¦‚ä¸Šé¢æåˆ°çš„ï¼Œå…¶ä»–æ•°æ®åº“å¯èƒ½éœ€è¦å¯¹ Users.java 代ç è¿›è¡Œä¸åŒçš„修改,或者根本ä¸ä½œä¿®æ”¹ã€‚例如,对于 MySQL æ•°æ®åº“,ä¸éœ€è¦åŒ…å« @GeneratedValue 注释,因为如果在创建表定义时为 user_id 列指定了 auto_increment,数æ®åº“会自动生æˆä¸»é”®å€¼ã€‚

创建类

创建实体控制器类

继续在 TestModelApp 项目中æ“作,在 com.samples.model 包中创建一个å«åš UserController çš„æ–°ç±»ã€‚ï¼ˆæˆ‘ä»¬å°†åœ¨ä¸‹é¢æä¾›æ­¤ç±»çš„ä»£ç ï¼Œå¯ä»¥å°†å®ƒç²˜è´´åˆ°æ‚¨çš„类中)。

展开 TestModelApp > Source Packages > com.samples.model 节点。注æ„åŒ…ä¸­å·²ç»æœ‰ä¸¤ä¸ªç±»ï¼šMain.java å’Œ Users.java。å³é”®å•击 com.samples.model 节点并选择 New > Java Class 选项。在 New Java Class å¯¹è¯æ¡†ä¸­ï¼Œå°†ç±»å称设置为 UserController(将其ä½ç½®ä¿ç•™ä¸º Source Packages 并将包åç§°ä¿ç•™ä¸º com.samples.model)。

创建 UserController 类
图 15: 创建 UserController 类(å•击放大图åƒï¼‰

在 Edit 窗å£ä¸­åº”该å¯ä»¥çœ‹è§æºä»£ç æ¡†æž¶ã€‚å‘类添加如下代ç ï¼š

代ç ç¤ºä¾‹ 2:UserController 代ç 
 private EntityManagerFactory emf;
 private EntityManager getEntityManager() {
 if(emf == null){
    emf = Persistence.createEntityManagerFactory("samplePU");
 }
    return emf.createEntityManager();
 }
 public Users[] getUsers() {
    EntityManager em = getEntityManager();
    try{
        javax.persistence.Query q = em.createQuery("select c from Users as c");
        return (Users[]) q.getResultList().toArray(new Users[0]);
    } finally {
        em.close();
    }
               }

使用 Fix Imports 函数导入需è¦çš„类。(在æºä»£ç ç¼–辑窗å£ä¸­å³é”®å•击,从弹出èœå•选择 Fix Imports 选项)。这样å¯ä»¥å°†ä»¥ä¸‹ 3 ä¸ªå¯¼å…¥è¯­å¥æ·»åŠ åˆ°ç±»ä¸­ï¼š

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

å¯ä»¥ä½¿ç”¨ Format 函数(在åŒä¸€ä¸ªå¼¹å‡ºèœå•中)设置代ç å¯¹é½çš„æ ¼å¼ã€‚

æ³¨æ„ UserController ç±»åŒ…å«æ–¹æ³• getUsers,该方法调用 javax.persistence.EntityManager 接å£ä¸Šçš„ createQuery 方法创建一个查询,该查询从 Users 表返回数æ®çš„行。查询的结果作为一个数组返回。

将实体 bean 绑定到表组件

您已ç»å°†ç”¨äºŽè®¿é—® Users æ•°æ®åº“表的实体组件绑定到 TestWebApp 项目中的一个 Table 组件。(实体 bean 是在 TestWebApp 中创建的)。在 TestWebApp 项目中进行此绑定。

䏋颿˜¯ç»‘定步骤:

在 SessionBean1 中创建一个返回 Users 对象数组的属性。 创建一个方法åˆå§‹åŒ–数组。 ç„¶åŽï¼Œå°† Users 对象数组绑定到 Table 组件。 使用 Java Persistence API Entity Manager 调用 Users 数组åˆå§‹åŒ–方法。

æŽ¥ä¸‹æ¥æ›´ä»”细地讨论一下这些步骤:

在 Session Bean 中创建一个属性

在 NetBeans IDE 中,å¯ä»¥åœ¨ä¸€äº›ä½ç½®æ‰¾åˆ°æ‰˜ç®¡ bean:在 Navigator 窗å£ï¼Œåœ¨ Projects 窗å£çš„æºä»£ç åŒ…节点中,以åŠåœ¨ Files 窗å£çš„ src > java > project-name 节点中。
在 SessionBean1 中创建一个返回 Users 对象数组的属性。在 Navigator 窗å£ä¸­ï¼ŒåŒå‡» SessionBean1 在 Java Source Editor 中打开。或者,从 Projects çª—å£ TestWebApp > Source Packages > com.samples.web 节点中åŒå‡» SessionBean1。如果没有看到 Navigator 窗å£ï¼Œé‚£ä¹ˆå°è¯•在 Design çª—å£æ˜¾ç¤º TestWebApp 的一个页é¢ï¼Œæ¯”如 Page1。Navigator 窗å£åº”该显示在 Projects 窗å£çš„下é¢ã€‚如果还是看ä¸åˆ° Navigator 窗å£ï¼Œåœ¨ Design 窗å£å•击 Design 标签。 å‘ SessionBean1 添加一个 users 属性。键入以下代ç ï¼šprivate Users[] users; ä¿®å¤å¯¼å…¥ã€‚刚输入的代ç å¾ˆå¯èƒ½è¢«æ ‡è®°ä¸ºé”™è¯¯ã€‚如果是这样,使用æºä»£ç ç¼–辑器的上下文èœå• Fix Imports 函数æ¥ä¿®å¤æ­¤é”™è¯¯ã€‚(确ä¿åœ¨ç»§ç»­ä¹‹å‰æ”¹æ­£è¿™ä¸ªé”™è¯¯ï¼‰ã€‚è¦ä¿®å¤æ­¤é”™è¯¯ï¼Œæ·»åŠ ä»¥ä¸‹å¯¼å…¥è¯­å¥ï¼š import com.samples.model.Users; 为 users å±žæ€§ç”Ÿæˆ get å’Œ set 方法。å³é”®å•击键入的代ç è¡Œå¹¶é€‰æ‹© Insert Code 动作。从弹出èœå•选择 Getter å’Œ Setter。然åŽï¼Œé€‰æ‹© users:Users[]。
å‘ SsessionBean1 添加属性
图 16: å‘ SsessionBean1 添加用户属性(å•击放大图片)

使用 Insert Code 动作添加公共的 get å’Œ set 方法。完æˆä¹‹åŽï¼ŒSessionBean1 应该包å«ä»¥ä¸‹ä»£ç ï¼š

代ç ç¤ºä¾‹ 3:用户属性的 get å’Œ set 方法
 private Users[] users;
    public Users[] getUsers() {
    return users;
 }
    public void setUsers(Users[] users) {
    this.users = users;
               }

创建åˆå§‹åŒ–方法

å‘ SessionBean1 添加一个 updateUsers 属性。此方法将用æ¥åˆå§‹åŒ– users 属性。以下是此方法的代ç ï¼š
代ç ç¤ºä¾‹ 4:updateUsers 方法
public void updateUsers(){
     UserController usersController = new UserController();
     users = usersController.getUsers();
                     } 

使用 Fix Imports å‡½æ•°ä¿®å¤ updateUsers 需è¦çš„导入。如果代ç ä¸­åŒ…å«é”™è¯¯ï¼Œæ‰§è¡Œ Save All files 清除这些错误。 å°† updateUsers 方法的调用添加到 SessionBean1 init 方法中:updateUsers();.SessionBean1 init 方法应该如下所示(未显示注释行):
代ç ç¤ºä¾‹ 5:SessionBean1 init 方法
public void init(){
     super.init();
     try {
          _init();
     } catch (Exception e) {
          log("SessionBean1 Initialization Failure", e);
          throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
     }
     updateUsers();
                     } 

ä¿å­˜æ‰€æœ‰æ–‡ä»¶ã€‚ 构建 TestModelApp å’Œ TestWebApp 项目。

将属性绑定到表组件

现在已ç»å°†åˆšæ·»åŠ çš„ users 绑定到一个 Table 组件了。

在 TestWebApp > Web Pages 中,åŒå‡» Page1.jsp 在 Design 窗å£ä¸­æ‰“开此页é¢ã€‚ å°† Table 组件从 Palette 拖到 Design 窗å£ä¸­çš„页é¢ä¸Šã€‚应该如下图所示:
å‘页颿·»åŠ  Table 组件
图 17: å‘ Page1 添加 Table 组件
å³é”®å•击页é¢ä¸Šçš„ Table 组件并在上下文èœå•中å•击 Bind to Data。在 Get Data From 下拉列表中选择 users(从 SessionBean1)作为绑定数组。(注æ„如果在下拉列表中没有 users 属性,å³é”®å•击 Design 窗å£å¹¶å•击上下文èœå•中的 Refresh 选项。或者在工具æ ä¸Šå•击 Refresh 按钮。如果还是未在下拉列表中看到 users å±žæ€§ï¼Œé‚£ä¹ˆé€‰æ‹©å¹¶é‡æ–°æ‰“å¼€ TestWebApp 项目)。å•击 OK 按钮。
Bind to Data å¯¹è¯æ¡†
图 18:在 Bind to Data å¯¹è¯æ¡†ä¸­é€‰æ‹©ç”¨æˆ·
Design 中显示的 Table 组件的更改如下。如果需è¦ï¼Œè°ƒæ•´æ˜¾ç¤ºçš„列。
绑定到用户数组的 Table
图 19: Design 窗å£ä¸­ç»‘定到用户数组的 Table 组件
部署和è¿è¡Œ TestWebApp 项目。显示 Table 组件,并且如果为数æ®åº“表创建了示例数æ®åº“,那么数æ®åº”该显示为如下形å¼ï¼š
æµè§ˆå™¨ä¸­çš„页颿˜¾ç¤º
图 20: æµè§ˆå™¨ä¸­ Page1 上的 Table 组件

结æŸè¯­

本文讨论了使用 Visual Web 应用程åºçš„ Java Persistence API çš„å¿…è¦æ­¥éª¤ã€‚展示了如何设置 Java SE 项目和 Visual Web JSF 项目并将它们链接起æ¥ã€‚也展示了如何创建数æ®åº“表和需è¦çš„键,以åŠä½¿ç”¨ Java Persistence API 绑定到数æ®åº“。本文æä¾›äº†è®¿é—®æ•°æ®åº“表所需的定制 Java 代ç ï¼Œæ­¤ä»£ç æ¼”示了如何创建实体 bean ä¿å­˜è¡¨æ•°æ®ã€‚最åŽï¼Œè¿˜å±•示了如何将实体 bean 绑定到 Visual Web Table ç»„ä»¶ï¼Œä»¥åŠ Table 如何简化数æ®åº“表数æ®çš„æ˜¾ç¤ºã€‚

第 2 篇文章(“使用 Java Persistence API 修改数æ®åº“表行”ï¼‰å°†å‘æ‚¨å±•示如何使用此 API æ·»åŠ ã€æ›´æ–°å’Œåˆ é™¤æ•°æ®åº“表行。此外,本文还包括一些技巧,用于最大é™åº¦åœ°åˆ©ç”¨ NetBeans IDE åŠå…¶å¯è§†çš„ web 函数。

更多信æ¯


This page was last modified: December 3, 2007

Bookmark this page

del.icio.us furl simpy slashdot technorati