借助 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 函数。
目录
本文所使用的外部代ç
本文将使用以下技术和资æº
1.2/Java EE 5** è¦åˆ©ç”¨ 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 组件(比如 Grid Panel)控制页é¢å¸ƒå±€ã€‚
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 - 类型:å—符串å¯ä»¥ä½¿ç”¨ Services 窗å£ä¸çš„ Databases 节点将 Users è¡¨æ·»åŠ åˆ° sample Derby æ•°æ®åº“。å¯ä»¥ä»Žä¸€ä¸ªæ–‡ä»¶æ‰§è¡Œ SQL 脚本创建æ¤è¡¨æˆ–者å•独执行æ¯è¡Œ SQL 代ç 。Services 窗å£ï¼ˆä»¥å‰ç§°ä½œ Runtime 窗å£ï¼‰ä¸çš„æ•°æ®åº“表节点上下文èœå•函数包括用于创建新表和执行 SQL 代ç 的函数。

Execute Command 功能打开一个 Editor 窗å£ï¼Œå¯ä»¥å‘å…¶ä¸è¾“入一行或多行 SQL 代ç 。å•击 Run 按钮执行窗å£çš„å†…å®¹ã€‚è¯·ç¡®ä¿ Connection å—æ®µæŒ‡ç¤ºæ‚¨å·²è¿žæŽ¥åˆ° sample æ•°æ®åº“。

å¯ä»¥ä½¿ç”¨ä»¥ä¸‹ä»£ç 在 Derby sample æ•°æ®åº“ä¸åˆ›å»º Users 表。注æ„åå¥ GENERATED ALWAYS AS IDENTITY 指示 Derby DBMS å°†ç”Ÿæˆ user_id ä¸»é”®å€¼ï¼Œå¹¶ä¸”å½“æ·»åŠ ä¸€ä¸ªæ–°çºªå½•æ—¶è¯¥ä¸»é”®å€¼è‡ªåŠ¨é€’å¢žã€‚å¦‚æžœå‘æ¤è¡¨ä¸æ‰‹åŠ¨æ·»åŠ è®°å½•ï¼Œæ¯”å¦‚ä½¿ç”¨ INSERT INTO 代ç ,请确ä¿ä½¿ç”¨ä¿ç•™å— DEFAULT æ¥æŒ‡ç¤º user_id 的值是由数æ®åº“æä¾›çš„。
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 Persistence API,实际上还需è¦åˆ›å»ºä¸¤ä¸ªé¡¹ç›®ã€‚第一个是 Visual Web 项目。å¦ä¸€ä¸ªæ˜¯ Java Standard Edition (SE) 应用程åºé¡¹ç›®ï¼ŒåŒ…括 web 应用程åºå°†è¦è°ƒç”¨å…¶ä»£ç 的一些类。从该 Java SE 应用程åºé¡¹ç›®ä¸ç”Ÿæˆä¸€ä¸ªæŒä¹…å•元,以获得 Java Persistence API çš„ä¸€ä¸ªå¥æŸ„。web 应用程åºç„¶åŽä½¿ç”¨åœ¨ Java SE 应用程åºé¡¹ç›®ä¸åˆ›å»ºçš„类建立数æ®åº“绑定,éšåŽæ‰§è¡Œæ•°æ®åº“æ›´æ–°ã€åˆ é™¤å’Œæ·»åŠ æ“作。
com.samples.model。å¯ä»¥é€šè¿‡å°†é»˜è®¤çš„ Create Main Class æ¡ç›®ç”± textmodelapp.Main 更改为 com.samples.model.Main æ¥å®žçŽ°ã€‚å•击 Finish 按钮。
创建 Visual Web 项目。在 New Project å¯¹è¯æ¡†ä¸é€‰æ‹© Web 类别,并选择 Web Application 项目,然åŽå•击 Next 按钮。
在 New Web Application å¯¹è¯æ¡†ä¸ï¼Œå°†é¡¹ç›®å称设置为 TestWebApp。项目ä½ç½®åº”该默认与 TestModelApp 项目ä½ç½®ç›¸åŒã€‚å•击 Next 按钮转到下一å±å¹•,在其ä¸é€‰æ‹©æ¡†æž¶ã€‚
为框架选择 Visual Web JavaServer Facesã€‚å½“è¿™æ ·é€‰æ‹©æ—¶ï¼Œå±å¹•显示é…置设置。将 Default Java Package 设置由 testwebapp 更改为 com.samples.web。完æˆè¿™ä¸€æ¥ä¹‹åŽï¼ŒTestModelApp å’Œ TestWebApp 会作为节点出现在 Project 窗å£ä¸ã€‚å•击 Finish 按钮。

现在需è¦å°†ä¸¤ä¸ªé¡¹ç›®é“¾æŽ¥èµ·æ¥ã€‚具体æ¥è¯´ï¼Œéœ€è¦è®© TestModelApp 作为 TestWebApp 项目的ä¾èµ–项。è¦å°† TestModelApp 作为 TestWebApp çš„ä¾èµ–项目,需è¦å°† TestModelApp.jar æ–‡ä»¶æ·»åŠ åˆ° TestWebApp é¡¹ç›®ã€‚ä¸‹é¢æ˜¯æ“作方法:
使用 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 Persistence 表示。JPA 使用 Java è¯è¨€æ³¨é‡ŠåŠŸèƒ½å°† POJO æ ‡è®°ä¸ºå¸¦æœ‰å¯¹è±¡å…³ç³»æ˜ å°„ä¿¡æ¯çš„ JPA 实体。使用 Entity Classes from Database 函数在 TestModelApp ä¸åˆ›å»ºå®žä½“类。

如果使用的是 Derby æ•°æ®åº“,需è¦å¯¹ç”Ÿæˆçš„ Users.java 代ç 进行一些修改,以处ç†ä¸»é”®å€¼çš„自动生æˆã€‚但是,其他数æ®åº“系统å¯ä»¥ä»¥ä¸åŒçš„æ–¹å¼å¤„ç†ä¸»é”®å€¼ç”Ÿæˆï¼Œå¯¹ç”Ÿæˆçš„ Users.java 类所åšçš„任何修改都必须与底层数æ®åº“的主键生æˆç–略匹é…。
创建 Users 实体类之åŽï¼Œéœ€è¦ä¿®æ”¹è¯¥ç±»ï¼Œä»¥ä¾¿è®©æ•°æ®åº“自动生æˆä¸»é”®å—段(用户 id å—æ®µï¼‰ã€‚JPA 使用 @Id æ³¨é‡Šæ ‡è¯†ä¸»é”®ã€‚å‘ä¸»é”®æ·»åŠ ç¬¬äºŒä¸ªæ³¨é‡Šï¼ŒæŒ‡ç¤ºç”Ÿæˆä¸»é”®å€¼çš„ç–略:@GeneratedValue(strategy=GenerationType.<...>),其ä¸ç–ç•¥å奿˜¯å¯é€‰çš„。注æ„,选择的生æˆç–略必须与数æ®åº“的性能相关è”。
å› ä¸º Derby æ•°æ®åº“æ”¯æŒ IDENTITY åˆ—ç±»åž‹ï¼Œå› æ¤å¯ä»¥ä¸ºä¸»é”®ç”Ÿæˆä¸€ä¸ªæƒŸä¸€å€¼ï¼Œè¿™ä¸ªä»»åŠ¡å¯ä»¥ç”±æ•°æ®åº“æ¥å®Œæˆã€‚å› æ¤ï¼Œå‘ä¸»é”®å®šä¹‰ä¸æ·»åР以䏋代ç 行:@GeneratedValue(strategy = GenerationType.IDENTITY).
进行修改之åŽï¼Œå®šä¹‰è¡¨çš„ 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;
...
æ³¨æ„ @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)。
在 Edit 窗å£ä¸åº”该å¯ä»¥çœ‹è§æºä»£ç 框架。å‘ç±»æ·»åŠ å¦‚ä¸‹ä»£ç :
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 表返回数æ®çš„行。查询的结果作为一个数组返回。
您已ç»å°†ç”¨äºŽè®¿é—® Users æ•°æ®åº“表的实体组件绑定到 TestWebApp 项目ä¸çš„一个 Table 组件。(实体 bean 是在 TestWebApp ä¸åˆ›å»ºçš„)。在 TestWebApp 项目ä¸è¿›è¡Œæ¤ç»‘定。
䏋颿˜¯ç»‘定æ¥éª¤ï¼š
æŽ¥ä¸‹æ¥æ›´ä»”细地讨论一下这些æ¥éª¤ï¼š
users 属性。键入以下代ç :private Users[] users; ä¿®å¤å¯¼å…¥ã€‚刚输入的代ç 很å¯èƒ½è¢«æ ‡è®°ä¸ºé”™è¯¯ã€‚å¦‚æžœæ˜¯è¿™æ ·ï¼Œä½¿ç”¨æºä»£ç 编辑器的上下文èœå• Fix Imports 函数æ¥ä¿®å¤æ¤é”™è¯¯ã€‚(确ä¿åœ¨ç»§ç»ä¹‹å‰æ”¹æ£è¿™ä¸ªé”™è¯¯ï¼‰ã€‚è¦ä¿®å¤æ¤é”™è¯¯ï¼Œæ·»åР以䏋坼入è¯å¥ï¼š import com.samples.model.Users; 为 users å±žæ€§ç”Ÿæˆ get å’Œ set 方法。å³é”®å•击键入的代ç 行并选择 Insert Code 动作。从弹出èœå•选择 Getter å’Œ Setter。然åŽï¼Œé€‰æ‹© users:Users[]。
使用 Insert Code åŠ¨ä½œæ·»åŠ å…¬å…±çš„ get å’Œ set 方法。完æˆä¹‹åŽï¼ŒSessionBean1 应该包å«ä»¥ä¸‹ä»£ç :
private Users[] users;
public Users[] getUsers() {
return users;
}
public void setUsers(Users[] users) {
this.users = users;
}
updateUsers å±žæ€§ã€‚æ¤æ–¹æ³•将用æ¥åˆå§‹åŒ– users å±žæ€§ã€‚ä»¥ä¸‹æ˜¯æ¤æ–¹æ³•的代ç :
public void updateUsers(){
UserController usersController = new UserController();
users = usersController.getUsers();
}
updateUsers 需è¦çš„导入。如果代ç ä¸åŒ…å«é”™è¯¯ï¼Œæ‰§è¡Œ Save All files 清除这些错误。 å°† updateUsers æ–¹æ³•çš„è°ƒç”¨æ·»åŠ åˆ° SessionBean1 init 方法ä¸ï¼šupdateUsers();.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();
}
现在已ç»å°†åˆšæ·»åŠ çš„ users 绑定到一个 Table 组件了。

users(从 SessionBean1)作为绑定数组。(注æ„å¦‚æžœåœ¨ä¸‹æ‹‰åˆ—è¡¨ä¸æ²¡æœ‰ users 属性,å³é”®å•击 Design 窗å£å¹¶å•击上下文èœå•ä¸çš„ Refresh 选项。或者在工具æ 上å•击 Refresh 按钮。如果还是未在下拉列表ä¸çœ‹åˆ° users å±žæ€§ï¼Œé‚£ä¹ˆé€‰æ‹©å¹¶é‡æ–°æ‰“å¼€ TestWebApp 项目)。å•击 OK 按钮。



本文讨论了使用 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 函数。