Spring boot Sprint Data JPA-save()方法在表中插入重复项
我有一个停机实体。我正在设置停机对象的值,并将这些对象传递到JpaReposirtorySpring boot Sprint Data JPA-save()方法在表中插入重复项,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我有一个停机实体。我正在设置停机对象的值,并将这些对象传递到JpaReposirtory保存(停机对象)方法保存()插入重复记录。我通过论坛,但没有运气,我没有得到任何解决方案。现在,我正在将对象保存到数据库中之后,检查是否插入了重复项。如果插入,我将通过JpaRepositorydelete(downtimeId)删除 我的向下实体 @Entity @Table(name = "tDownTime") public class DownTime { @Id @Generated
保存(停机对象)
方法<代码>保存()插入重复记录。我通过论坛,但没有运气,我没有得到任何解决方案。现在,我正在将对象保存到数据库中之后,检查是否插入了重复项。如果插入,我将通过JpaRepositorydelete(downtimeId)
删除
我的向下实体
@Entity
@Table(name = "tDownTime")
public class DownTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "DowntimeId")
private int downtimeId;
@Column(name = "SiteId")
private int siteId;
@Column(name = "PlantId")
private int plantId;
@Column(name = "UnitId")
private int unitId;
@Column(name = "EquipmentId")
private int equipmentId;
@Column(name = "ShiftId")
private int shiftId;
@Column(name = "DownTimeReasonId")
private Integer downTimeReasonId;
@Column(name = "DownTimeReasonName")
private String downTimeReasonName;
@Column(name = "DownTimeReasonDescription")
private String downTimeReasonDescription;
@Column(name = "DownTimeStartDate")
private LocalDate downTimeStartDate;
@Column(name = "DownTimeStartTime")
private LocalTime downTimeStartTime;
@Column(name = "DownTimeEndDate")
private LocalDate downTimeEndDate;
@Column(name = "DownTimeEndTime")
private LocalTime downTimeEndTime;
@Column(name = "DownTimeDuration")
private Long downTimeDuration;
@Column(name = "HourResetTime")
private LocalDateTime hourResetTime;
@Column(name = "KPIDate")
private LocalDate kPIDate;
@Column(name = "CreatedBy")
private String createdBy;
@Column(name = "CreatedOn")
private LocalDateTime createdOn;
@Column(name = "ModifiedBy")
private String modifiedBy;
@Column(name = "ModifiedOn")
private LocalDateTime modifiedOn;
@Column(name = "SKUId")
private int sKUID;
@Column(name = "DownTimeStartDateTime")
private LocalDateTime downTimeStartDateTime;
@Column(name = "DownTimeEndDateTime")
private LocalDateTime downTimeEndDateTime;
@Column(name = "WorkOrderId")
private int workOrderId;
@Column(name = "IsManual")
private boolean isManual;
@Column(name = "AutoPauseResume")
private boolean isAutoPauseResume;
@Column(name = "DowntimeType")
private String downtimeType;
@Column(name = "DownTimeStatus")
private String downtimeStatus;
DownTime downTime = new DownTime();// creating object for setting values to object to save as entity
downTime.setUnitId(calculationOEEHelper.getUnitId()); downTime.setEquipmentId(calculationOEEHelper.getEquipmentId());
downTime.setShiftId(calculationOEEHelper.getShiftId());
downTime.setDownTimeReasonId(0);
downTime.setDownTimeReasonName(ParameterTags.UNASSIGNED);
.
.
.
downTime = downtimeRepository.save(downTime);
它正在数据库中插入2个实体。我正在使用MSSQL数据库
停机时间[downtimeId=2148,siteId=1,plantId=1,unitId=12,
equipmentId=33,shiftId=28,downTimeReasonId=0,
downTimeReasonName=未分配,downTimeReasonDescription=未分配,
downTimeStartDate=2019-05-11,downTimeStartTime=06:36:42,
downTimeEndDate=2019-05-11,downTimeEndTime=06:37:23,
停机时间=41小时设置时间=2019-05-11T07:30:01,
kPIDate=2019-05-11,createdBy=SYSTEM,
createdOn=2019-05-12T01:06:55.865,由系统修改,
修改日期:2019-05-12T01:06:55.865,sKUID=5,
DowntimesStartDateTime=2019-05-11T06:36:42,
downTimeEndDateTime=2019-05-11T06:37:23,workOrderId=74,
isManual=false,isAutoPauseResume=true,downtimeType=NOT SCHEDULED,
downtimeStatus=正在运行]
停机时间[downtimeId=2149,siteId=1,plantId=1,unitId=12,
equipmentId=33,shiftId=28,downTimeReasonId=0,
downTimeReasonName=未分配,downTimeReasonDescription=未分配,
downTimeStartDate=2019-05-11,downTimeStartTime=06:36:42,
downTimeEndDate=2019-05-11,downTimeEndTime=06:37:23,
停机时间=41小时设置时间=2019-05-11T07:30:01,
kPIDate=2019-05-11,createdBy=SYSTEM,
createdOn=2019-05-12T01:06:55.865,由系统修改,
修改日期:2019-05-12T01:06:55.865,sKUID=5,
DowntimesStartDateTime=2019-05-11T06:36:42,
downTimeEndDateTime=2019-05-11T06:37:23,workOrderId=74,
isManual=false,isAutoPauseResume=true,downtimeType=NOT SCHEDULED,
downtimeStatus=正在运行]
downtimeId不同,其余的都是相同的
有人能帮我解决这个问题吗。我不确定我是否理解你想要实现的目标,但这似乎是预期的行为。如果要更新对象而不是创建新对象,则应从存储库中获取旧版本并在其上设置值。我不确定是否理解您试图实现的目标,但这似乎是预期的行为。如果要更新对象而不是创建新对象,则应从存储库中获取旧版本并在其上设置值。是否可以在保存/持久化方法之前共享更多日志或添加一些日志记录程序?查看实体和持久化方法很难判断幕后发生了什么。您的对象具有不同的ID,它们不是重复的。这些不是Java对象。我在这里复制了DB RecordsCan在save/persist方法之前是否共享更多日志或添加一些日志?查看实体和持久化方法很难判断幕后发生了什么。您的对象具有不同的ID,它们不是重复的。这些不是Java对象。我在这里复制了数据库记录我在这里发布的是那些是数据库记录。不是Java对象。您发布了一个表示数据库DB表的实体类,我假设您使用的是某种类似于Hibernate的ORM(简单地说就是将数据库行映射到Java对象)。现在,当您使用
downtimeRepository.save(宕机)时代码>,您的应用程序在表tDownTime
中插入新行,因为您创建了新实体而不是更新旧实体。要更新旧实体,您应该首先从存储库中获取它(尝试downtimeRepository.findAll()
,downtimeRepository.findOne()
),然后使用setters更新数据,最后使用downtimeRepository.save()
保存更改。您可以进一步了解它,我在这里发布的是数据库记录。不是Java对象。您发布了一个表示数据库DB表的实体类,我假设您使用的是某种类似于Hibernate的ORM(简单地说就是将数据库行映射到Java对象)。现在,当您使用downtimeRepository.save(宕机)时代码>,您的应用程序在表tDownTime
中插入新行,因为您创建了新实体而不是更新旧实体。要更新旧实体,您应该首先从存储库中获取它(尝试downttimerepository.findAll()
,downttimerepository.findOne()
),然后使用setters更新数据,最后使用downttimerepository.save()
保存更改。您可以详细阅读