在NetBeans中用GlassFish与Derby搭建Jakarta EE遇多类问题求解决
Jakarta EE + GlassFish + Derby 问题解决方案
1. IDE选择适配问题
虽IntelliJ需订阅、Eclipse的GlassFish插件已归档,但NetBeans是当前可行选择,需注意版本匹配:
- 确保NetBeans版本与Jakarta EE、GlassFish兼容:NetBeans 17+ 支持Jakarta EE 9/10,搭配GlassFish 6/7;
- 安装NetBeans时选择"Java EE"或"Jakarta EE"组件包,自动关联GlassFish与Derby的基础配置。
2. java.lang.ClassNotFoundException: org.apache.derby.jdbc.Clientdriver 异常
核心问题是驱动类名拼写错误+驱动包未正确加载:
- 修正驱动类名:正确类名为
org.apache.derby.jdbc.ClientDriver(注意Driver首字母大写); - 确保Derby客户端驱动包加载:
- 项目层面:NetBeans右键项目 → Libraries → Add Library → 选择"Java DB Driver"(NetBeans自带Derby驱动);
- 服务器层面:将
derbyclient.jar复制到GlassFish安装目录下的domains/domain1/lib/ext文件夹,重启GlassFish。
3. javax.persistence.RollbackException: Transaction "rolled back" because transaction was set to RollbackOnly 异常
事务被强制回滚的本质是执行过程中出现未捕获异常,导致JPA自动标记事务回滚:
- 查看GlassFish服务器日志(
domains/domain1/logs/server.log),定位触发回滚的根异常(如SQL错误、实体映射错误); - 检查
@Transactional修饰的方法,确保内部异常被捕获处理,避免未检查异常抛出; - 若需强制提交(仅确认无数据一致性问题时使用),可通过
UserTransaction手动清除回滚标记:UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction"); if (ut.getStatus() == Status.STATUS_MARKED_ROLLBACK) { ut.setRollbackOnly(false); } ut.commit(); - 验证
persistence.xml事务配置:使用JTA时确保<transaction-type>JTA</transaction-type>,数据源配置正确。
4. java.sql.SQLSyntaxErrorException: Table/View 'CUSTOMER' does not exist 异常
表存在但报错找不到,大概率是大小写匹配问题或连接库错误:
- 检查表名大小写:Derby默认区分标识符大小写,若数据库中表为小写
customer,而JPA实体用大写CUSTOMER会导致找不到:- 方案1:修改实体类
@Table注解,指定正确表名:@Table(name = "customer"); - 方案2:在
persistence.xml中添加全局引号配置(以Hibernate为例):<property name="hibernate.globally_quoted_identifiers" value="true"/>
- 方案1:修改实体类
- 确认连接的数据库实例:检查
persistence.xml中的JDBC URL,确保指向正确的Derby数据库(如jdbc:derby://localhost:1527/YourDBName); - 禁用JPA自动建表冲突:若手动创建了表,将
persistence.xml中的hibernate.hbm2ddl.auto设为none或validate,避免自动删除重建表。
内容的提问来源于stack exchange,提问作者Guillem Chesa
相关产品推荐
相关产品推荐

