java - Spring Data 使用昨天的日期更新实体

标签 java mysql spring date jpa

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

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

键“work_day_workday_date_uindex”的条目“2019-07-27”重复

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

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

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

这是 WorkDay 实体:

@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 接口(interface),它扩展了 JpaRepository。

最诚挚的问候!

最佳答案

在保存记录之前设置 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;

关于java - Spring Data 使用昨天的日期更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57240750/

相关文章:

mysql - LOAD DATA LOCAL INFILE 不导入任何记录

mysql - 提取日期时间的日期部分真的有必要吗?

mysql - eJabberd mysql_conn undef

java - 如何手动使 Spring Batch 作业失败?

spring - java.sql.SQLException : operation not allowed: streams type cannot be used in batching while inserting data into Oracle clob data type

java - Android:如何关联来自同一拖动 Action 的 ACTION_DOWN 和 ACTION_MOVE 事件

java - 堆不想更改大小(java.lang.OutOfMemoryError)android studio

java - Java中如何从多层数组中获取特定值

java - java中 "this"和没有 "this"之间的区别

spring - ant.propertyFile每次都会更新评论