我在将数据更新(以及插入)到数据库时遇到一些问题。我有一个具有一些 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/