JpaRepository 不更新实体

据我所知,JpaRepository save() 方法应该更新我在数据库中的实体。


我在 MySQL 中有一个名为 REF_PERIOD 的表,只有两列:code_id,它是 INT 和主键,以及 code_name,它是 VARCHAR。


这是我的实体:


@Data

@Entity

@Table(name = "REF_PERIOD")

public class PayRefPeriod {


    @Id

    @Column(name = "code_id")

    private int codeId;


    @Column(name = "code_name", length = 254, nullable = false)

    private String codeName;

}

我的存储库:


@Repository

public interface PayRefPeriodRepository extends JpaRepository<PayRefPeriod, Integer> {


}

和控制器:


@Slf4j

@RestController

@RequestMapping("/api")

public class PayRefPeriodController {


    @Autowired

    private PayRefPeriodRepository payRefPeriodRepository;


    // Get all pay reference periods

    @GetMapping("/payrefperiods")

    public List<PayRefPeriod> getAllPayRefPeriod() {

        return payRefPeriodRepository.findAll();

    }


    // Create a new pay reference period

    @PostMapping("/payrefperiods")

    public PayRefPeriod createPayRefPeriod(@Valid @RequestBody PayRefPeriod payRefPeriod) {

        return payRefPeriodRepository.save(payRefPeriod);

    }


    // Get a single pay reference period

    @GetMapping("/payrefperiods/{id}")

    public PayRefPeriod PayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {

        return payRefPeriodRepository.findById(payRefPeriodId)

                .orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));

    }


    // Update a pay reference period

    @PutMapping("/payrefperiods/{id}")

    public PayRefPeriod updatePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId,

                                      @Valid @RequestBody PayRefPeriod payRefPeriodDetails) {

    }



我希望 updatePayRefPeriod 方法更新我的实体(在 MySQL 数据库中具有 Id 0),但是它抛出异常:java.sql.SQLIntegrityConstraintViolationException:键“PRIMARY”的重复条目“0”。


我做错了什么?


侃侃无极
浏览 197回答 2
2回答

偶然的你

我想这可能是 mysql 驱动程序特定的限制,int当我们将它用作标识符时,对于 java 原始类型。我建议您将 的类型更改codeId为其盒装对象类型Integer。@Id@Column(name = "code_id")private Integer codeId;因此,当底层休眠生成相应的更新查询时,它可以理解空标识符与非空但值为0的标识符之间的区别。

紫衣仙女

尝试将 sequenceGenerator 和 GeneratedValue 添加到您的 id 列。@Data@Entity@Table(name = "REF_PERIOD")public class PayRefPeriod {@SequenceGenerator(name = "generator", sequenceName = "REF_PERIOD_ID_SEQ")@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")@Id@Column(name = "code_id")private int codeId;@Column(name = "code_name", length = 254, nullable = false)private String codeName;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java