简体   繁体   English

JpaRepository 不更新实体

[英]JpaRepository not updating entity

As far as I undestood, JpaRepository save() method should update my entity in database.据我所知, JpaRepository save() 方法应该更新我在数据库中的实体。

I have a table in MySQL called REF_PERIOD with two columns only: code_id, which is INT and Primary Key, and code_name, which is VARCHAR.我在 MySQL 中有一个名为 REF_PERIOD 的表,只有两列:code_id,它是 INT 和主键,以及 code_name,它是 VARCHAR。

This is my Entity:这是我的实体:

@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;
}

My Repository:我的存储库:

@Repository
public interface PayRefPeriodRepository extends JpaRepository<PayRefPeriod, Integer> {

}

And the Controller:和控制器:

@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) {

        PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
                .orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));

        payRefPeriod.setCodeName(payRefPeriodDetails.getCodeName());

        log.debug(payRefPeriod.toString());

        return payRefPeriodRepository.save(payRefPeriod);
    }

    // Delete a pay reference period
    @DeleteMapping("/payrefperiods/{id}")
    public ResponseEntity<?> deletePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {
        PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
                .orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));

        payRefPeriodRepository.delete(payRefPeriod);

        return ResponseEntity.ok().build();
    }
}

I expect the updatePayRefPeriod method to update my entity (which has Id 0 in MySQL database), however it throws an exception: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'.我希望 updatePayRefPeriod 方法更新我的实体(它在 MySQL 数据库中的 Id 为 0),但是它会引发异常:java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'。

What I'm doing wrong?我做错了什么?

I suppose it might be a mysql driver specific limitation that for java primitive type int when we use it for identifier.我想这可能是 mysql 驱动程序特定的限制,当我们将它用作标识符时,对于 java 原始类型int I suggest you change the type of the codeId to its boxed object type Integer .我建议您将codeId的类型更改为其装箱对象类型Integer

@Id
@Column(name = "code_id")
private Integer codeId;

Thus the underlying hibernate can understand the difference between a null identifier and not null but 0 valued identifier when it generates the corresponding update queries.因此,底层休眠在生成相应的更新查询时可以理解标识符和非空但值为 0 的标识符之间的区别。

Try adding sequenceGenerator and GeneratedValue to your id column.尝试将 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;

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM