使用JPA操作MySQL无法找到数据持久化存储位置
问题核心原因
你的persistence.xml中持久化单元的事务类型配置为JTA,按照JPA规范,JTA事务模式下,应用服务器(NetBeans默认绑定的GlassFish/Payara等)会优先使用自身内置的数据源,你配置的javax.persistence.jdbc.*系列连接参数会被直接忽略。
你当前的业务数据实际存储在应用服务器默认的H2内置数据库中,没有写入你本地MySQL的newlmstest库。
排查修正步骤
- 确认应用服务器的默认数据源配置:NetBeans默认Web项目使用的GlassFish/Payara服务器默认数据源为
jdbc/__default,底层是H2数据库,若为内存模式,重启服务器后数据会直接丢失。 - 修正持久化配置:
方案1:改用RESOURCE_LOCAL事务类型,即可读取你配置的JDBC参数连接MySQL,修改persistence-unit标签属性为<persistence-unit name="primefaces-jsf-pu" transaction-type="RESOURCE_LOCAL">
方案2:保留JTA模式,先在应用服务器后台手动配置指向newlmstest库的MySQL数据源,再在persistence-unit中添加<jta-data-source>你配置的数据源名称</jta-data-source>标签指定数据源。 - 额外校验:你当前配置的
javax.persistence.jdbc.password值为(),若你的MySQL root用户实际密码为空,需要将该属性值改为空字符串,否则即使修正事务类型也会因为密码错误连接失败。 - 验证表生成:可在persistence.xml的properties节点中添加SQL打印参数,确认建表语句执行位置:
若使用EclipseLink(GlassFish默认JPA实现)添加:<property name="eclipselink.logging.level.sql" value="FINE"/>
若使用Hibernate添加:<property name="hibernate.show_sql" value="true"/>
内容的提问来源于stack exchange,提问作者user1610132
相关产品推荐
相关产品推荐

