You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot-JPA部署WildFly后无法写入数据库,STS运行正常求助

SpringBoot-JPA部署WildFly后无法写入数据库排查

问题背景

SpringBoot-JPA项目在STS IDE本地运行时可正常向数据库插入数据,但打包成war部署到WildFly服务器后,数据无法写入数据库。

现有配置与代码

1. application.properties配置

spring.datasource.hikari.auto-commit=false
spring.servlet.multipart.enabled=true
logging.level.org.springframework.web=DEBUG
spring.jpa.hibernate.ddl-auto = update
spring.main.allow-circular-references:true
spring.main.web-environment=false

2. Controller代码

@RestController
@RequestMapping("/api")
@EnableWebMvc
public class BlogController {
    @Autowired
    BlogService blogService;
    // 创建博客条目
    @RequestMapping(value = "/writeblog", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody Blog createBlog(@RequestParam("file") MultipartFile file, @ModelAttribute Blog blogContent)
            throws IOException {
        return blogService.saveBlogContent(file, blogContent);
    }
}

3. Service代码

@Service
@Transactional
public class BlogService {
    @Lazy
    @Autowired
    private BlogRepository blogRepository;

    public Blog saveBlogContent(MultipartFile file, Blog blogContent) throws IOException {
        String blogImgURl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/api/blogimage/").toUriString();
        
        long millis = System.currentTimeMillis();
        java.sql.Date date = new java.sql.Date(millis);
        blogContent.setImage(file.getBytes());
        
        blogContent.setPublishDate(date);
        blogContent.setBlogImageUrl(blogImgURl);
        Blog blog = blogRepository.saveAndFlush(blogContent);
        return blog;
    }
}

4. Repository代码

@Repository
public interface BlogRepository extends JpaRepository<Blog, Long>{

    Blog findByBlogId(Long blogId);
}

5. 实体类配置

实体使用@GeneratedValue(strategy = GenerationType.IDENTITY)生成自增blogId,接口返回示例:

{ 
"blogId": 10, 
"employeeId": 202, 
"blogTitle": "blog Title TEST-55", 
"blogContent": "blog CONTENT TESTING-555", 
"image": "" 
}

可能的问题点及解决方案

1. 事务提交冲突

你设置了spring.datasource.hikari.auto-commit=false,但WildFly默认使用JTA事务管理,和Spring的事务上下文可能存在冲突。

  • 排查:检查WildFly是否开启JTA,Spring Boot部署到容器时会优先使用容器事务管理器而非自身Hikari事务。
  • 解决:
    • 尝试将spring.datasource.hikari.auto-commit设为true;
    • 或显式配置Spring适配WildFly的JTA事务:
      spring.jta.enabled=true
      spring.transaction.jta.platform=wildfly
      

2. 数据源配置缺失

本地运行时STS可能自动读取IDE中的数据源配置,但war包部署时可能缺少完整的数据库连接信息。

  • 排查:检查application.properties是否包含以下核心配置:
    spring.datasource.url=jdbc:mysql://xxx:3306/your_db
    spring.datasource.username=xxx
    spring.datasource.password=xxx
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
  • 解决:补充完整连接信息,或在WildFly的standalone.xml中配置全局数据源,Spring通过JNDI引用:
    spring.datasource.jndi-name=java:jboss/datasources/YourDataSource
    

3. 类加载版本冲突

WildFly自带的JPA/Hibernate库可能和Spring Boot打包的版本冲突,导致Hibernate无法正常初始化。

  • 排查:查看WildFly日志是否存在类加载异常或Hibernate初始化错误。
  • 解决:
    • 在pom.xml中排除Spring Boot自带的Hibernate依赖,使用WildFly提供的版本:
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.hibernate</groupId>
                  <artifactId>hibernate-core</artifactId>
              </exclusion>
              <exclusion>
                  <groupId>org.hibernate.javax.persistence</groupId>
                  <artifactId>hibernate-jpa-2.1-api</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      
    • 或在WEB-INF/jboss-deployment-structure.xml中配置类加载隔离,优先使用war包内的库:
      <jboss-deployment-structure>
          <deployment>
              <exclude-subsystems>
                  <subsystem name="jpa" />
              </exclude-subsystems>
              <exclusions>
                  <module name="org.hibernate" />
                  <module name="org.hibernate.javax.persistence" />
              </exclusions>
          </deployment>
      </jboss-deployment-structure>
      

4. 自增ID策略兼容性

GenerationType.IDENTITY策略在WildFly环境下可能因数据库驱动版本不兼容出现问题。

  • 排查:确认数据库驱动版本与数据库版本匹配,比如MySQL 8.0需使用com.mysql.cj.jdbc.Driver。
  • 解决:
    • 更新驱动依赖版本:
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.33</version>
      </dependency>
      
    • 尝试将生成策略改为GenerationType.AUTO,让Hibernate自动适配容器环境:
      @GeneratedValue(strategy = GenerationType.AUTO)
      

5. 日志定位建议

开启更详细的Hibernate和事务日志,查看具体错误:

logging.level.org.hibernate=DEBUG
logging.level.org.springframework.transaction=DEBUG

通过WildFly日志目录(默认standalone/log/server.log)查看是否有SQL执行异常、事务回滚等信息,精准定位失败原因。

内容的提问来源于stack exchange,提问作者SOP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:03:22