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

Spring Data JPA中JpaRepository持续抛出Bean异常求助

Spring Data JPA Repository Bean 创建失败问题解决

问题描述

最近学习Spring Data JPA,按教程操作时创建Repository一直触发Bean异常,尝试注解配置和XML文件配置都无法解决,相关代码及异常信息如下:

原代码

启动类

package com.convential.mainclasspackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringDataJpaConventialApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataJpaConventialApplication.class, args);
    }

    @Bean
    CommandLineRunner commandlineRunner(ProductRepository productRepository) {
        return (args) -> {
            product tv = new product("TV", 250);
            productRepository.save(tv);
        };
    } 
}

实体类

package com.convential.mainclasspackage;

import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;

@Entity(name = "product")
@Table(
        name = "product", uniqueConstraints = {
                @UniqueConstraint(name = "product_name_unique_constraint", columnNames = "product_name")
        }
)
public class product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int productId;

    @Column(name = "product_name", nullable = true, unique = true, columnDefinition = "TEXT")
    private String productName;

    @Column(name = "product_quantity", nullable = true, updatable = true)
    private int productQuantity;

    public product() {}

    public product(String productName, int productQuantity) {
        this.productName = productName;
        this.productQuantity = productQuantity;
    }

    public product(int productId, String productName, int productQuantity) {
        this.productId = productId;
        this.productName = productName;
        this.productQuantity = productQuantity;
    }

    public int getProductId() { return productId; }

    public String getProductName() { return productName; }

    public void setProductName(String productName) { this.productName = productName; }

    public int getProductQuantity() { return productQuantity; }

    public void setProductQuantity(int productQuantity) { this.productQuantity = productQuantity; }

    @Override
    public String toString() {
        return "Product [productId=" + productId + ", productName=" + productName + ", productQuantity="
                + productQuantity + "]";
    }
}

Repository接口

package com.convential.mainclasspackage;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<product, Integer> {
    List<product> findByName();
    product findByProduct_id(long id);
}

异常信息

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'commandlineRunner' defined in com.convential.mainclasspackage.SpringDataJpaConventialApplication: Unsatisfied dependency expressed through method 'commandlineRunner' parameter 0: Error creating bean with name 'productRepository' defined in com.convential.mainclasspackage.ProductRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract com.convential.mainclasspackage.product com.convential.mainclasspackage.ProductRepository.findByProduct_id(long); Reason: Failed to create query for method public abstract com.convential.mainclasspackage.product com.convential.mainclasspackage.ProductRepository.findByProduct_id(long); No property 'product' found for type 'product'; Did you mean 'productId'

问题分析

异常核心提示已经明确指出问题:

  1. findByProduct_id方法命名不符合Spring Data JPA规则:实体类中对应的属性是productId,方法名里的product_id会被解析为寻找名为product的属性,导致找不到对应属性。
  2. findByName()方法同样不符合规则:实体类中没有name属性,只有productName,无法生成查询语句。
  3. findByProduct_id的参数类型是long,但实体类中productId是int类型,类型不匹配。

解决方案

  1. 修正Repository接口的方法命名和参数类型,使其匹配实体类属性:
package com.convential.mainclasspackage;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<product, Integer> {
    // 匹配实体类的productName属性
    List<product> findByProductName();
    // 修正命名为findByProductId,参数类型改为Integer(或int)
    product findByProductId(Integer id);
}
  1. (可选但建议)修正实体类类名符合Java编码规范(类名首字母大写),同时修改启动类中的实例化代码:

修正后的实体类

package com.convential.mainclasspackage;

import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;

@Entity(name = "product")
@Table(
        name = "product", uniqueConstraints = {
                @UniqueConstraint(name = "product_name_unique_constraint", columnNames = "product_name")
        }
)
public class Product { // 类名首字母大写

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int productId;

    @Column(name = "product_name", nullable = true, unique = true, columnDefinition = "TEXT")
    private String productName;

    @Column(name = "product_quantity", nullable = true, updatable = true)
    private int productQuantity;

    public Product() {}

    public Product(String productName, int productQuantity) {
        this.productName = productName;
        this.productQuantity = productQuantity;
    }

    public Product(int productId, String productName, int productQuantity) {
        this.productId = productId;
        this.productName = productName;
        this.productQuantity = productQuantity;
    }

    public int getProductId() { return productId; }

    public String getProductName() { return productName; }

    public void setProductName(String productName) { this.productName = productName; }

    public int getProductQuantity() { return productQuantity; }

    public void setProductQuantity(int productQuantity) { this.productQuantity = productQuantity; }

    @Override
    public String toString() {
        return "Product [productId=" + productId + ", productName=" + productName + ", productQuantity="
                + productQuantity + "]";
    }
}

修正后的启动类

package com.convential.mainclasspackage;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringDataJpaConventialApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataJpaConventialApplication.class, args);
    }

    @Bean
    CommandLineRunner commandlineRunner(ProductRepository productRepository) {
        return (args) -> {
            Product tv = new Product("TV", 250); // 对应修改类名
            productRepository.save(tv);
        };
    } 
}

修正后的Repository接口(对应实体类改名)

package com.convential.mainclasspackage;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Integer> {
    List<Product> findByProductName();
    Product findByProductId(Integer id);
}

内容的提问来源于stack exchange,提问作者Mat-Zaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:40