【问题标题】:Spring Data update entity with yesterday's date具有昨天日期的 Spring Data 更新实体
【发布时间】:2019-12-06 00:30:33
【问题描述】:

我在将数据更新(以及插入)到我的数据库时遇到了一些问题。我有一个具有一些integer 属性的实体,一些String 属性,但也有一个具有LocalDate 类型的属性,它必须是unique

我将很多这样的实体放入数据库中,但用户需要对其进行编辑并更新一些属性。当我尝试对其进行测试并更改一些String 属性并将更新的实体保存到数据库时,我在控制台中看到了这个错误日志:

Duplicate entry '2019-07-27' for key 'work_day_workday_date_uindex'

如您所见,Hibernate 尝试将对象放入昨天的日期。但为什么?我以传统( :D )方式检查它->在将对象保存到数据库之前输入System.out.println 指令。 日志显示了正确的打印日期: WorkDay{id=296, date=2019-07-28, workingTime=8,.... 所以我认为问题与数据库和应用程序之间的时间差异有关。

我在 StackOverflow 中找到了一些提示。有人说在 SpringBoot 中从 application.properties 中删除 serverTimezone=UTC 会有所帮助。它解决了问题 - 昨天我成功更新了实体。但是今天我重新编码,问题又出现了。

我希望你们中的一些人过去可能遇到过这个问题并且知道一些解决方案 - 这对我很有帮助:)

这是工作日实体:

@Entity
@Table(name = "work_day")
public class WorkDay implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_workday")
    private Long id;
    @NotNull
    @Column(name = "workday_date", nullable = false, unique = true)
    private LocalDate date;
    @NotNull
    @Column(name = "working_time", nullable = false)
    private Integer workingTime;
    @Column(name = "booked_artist")
    private String bookedArtist;
    
    @ManyToOne
    @JoinColumn(name="workday_importance_id")
    private WorkDayImportance workDayImportance;
    
    @ManyToMany
    @JoinTable(name = "workday_employee",
            joinColumns = {@JoinColumn(name = "workday_id",
                    referencedColumnName = "id_workday")},
            inverseJoinColumns = {@JoinColumn(name="employee_id",
                    referencedColumnName = "id_employee")})
    private List<Employee> employers;
    
    @OneToMany(mappedBy = "workDay", cascade = CascadeType.REMOVE)
    private List<Comment> comments;

这是我执行此操作的一些代码:

    public void setBookedArtist(Long workDayId, String artist){
            workDayRepository
                 .findById(workDayId)
                 .ifPresent(workDay -> workDayDetailsService.saveBookedArtist(workDay, artist));
        }

    void saveBookedArtist(WorkDay workDay, String artist){
            if(artist != null && !artist.equals("")) {
                workDay.setBookedArtist(artist);
                workDayRepository.save(workDay);
            }
        }

实体存储库是 Spring Data 接口,它扩展了 JpaRepository。

最好的问候!

【问题讨论】:

  • 分享相关代码会有帮助,目前我只能说你可能不是在更新记录而是用旧数据插入新记录
  • 或者,很可能因为它是LocalDate,所以您的时区已关闭。
  • 好的,我在执行更新操作的地方添加了代码。当我为LocalDate 字段禁用unique = true 时,它正确更新,但后来我在db 中复制了日期。在这个应用程序中它必须是唯一的
  • 尝试在保存repo.save()之前添加`workDay.setworkDayId(artist.getworkDayId());`并让我知道结果
  • @PatelRomil 我添加了这个,错误和以前一样:Duplicate entry '*yesterday's date*' for key 'work_day_workday_date_uindex'

标签: java mysql spring date jpa


【解决方案1】:

在保存记录之前设置 workDay 的 Id 应该可以工作,因为我们不想更新日期集 updatable = false 如下

 public void setBookedArtist(Long workDayId, String artist){
            workDayRepository
                 .findById(workDayId)
                 .ifPresent(workDay -> workDayDetailsService.saveBookedArtist(workDay, artist));
        }

    void saveBookedArtist(WorkDay workDay, String artist){
            if(artist != null && !artist.equals("")) {
                workDay.setId(workDay.getId());
                workDay.setBookedArtist(artist);
                workDayRepository.save(workDay);
            }
        }

 @NotNull
    @Column(name = "workday_date", nullable = false, unique = true, updatable = false)
    private LocalDate date;

【讨论】:

  • 有效! :) 非常感谢你和其他有兴趣帮助我解决这个问题的人。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2023-03-07
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多