Java 重复输入';[十] &x27;对于键';[Y] &x27;关于JPA存储库';保存';活动已保存的实体已定义其键
据我所知,JPA存储库中的“save”函数应该会在具有提供的键的行已经存在时自动执行更新。但是,我遇到了一些错误,使它看起来像是在尝试执行盲Java 重复输入';[十] &x27;对于键';[Y] &x27;关于JPA存储库';保存';活动已保存的实体已定义其键,java,hibernate,jpa,repository,Java,Hibernate,Jpa,Repository,据我所知,JPA存储库中的“save”函数应该会在具有提供的键的行已经存在时自动执行更新。但是,我遇到了一些错误,使它看起来像是在尝试执行盲insert操作,而不是更新。我在这里有点不知所措 我的实体如下所示: @Entity @Data @Table(name = "inquiry_record") @NoArgsConstructor public class InquiryRecordEntity { @Id @Column(name = "inquiry_id")
insert
操作,而不是更新。我在这里有点不知所措
我的实体如下所示:
@Entity
@Data
@Table(name = "inquiry_record")
@NoArgsConstructor
public class InquiryRecordEntity {
@Id
@Column(name = "inquiry_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer inquiryId;
//Lots more fields down below, not important, no other keyed columns
}
我有一个简单的存储库:
@Repository
public interface InquiryRecordRepository extends CrudRepository<InquiryRecordEntity, Integer> {
}
但如果我希望它只是覆盖上一个值,它会抛出一个错误:
[ERROR] o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry '113' for key 'uk_tm_inquiry_id'
[ERROR] c.s.f.c.a.ApiControllerExceptionHandler - org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [uk_tm_inquiry_id]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [uk_tm_inquiry_id]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
我在这里遗漏了什么吗?快速检查您试图保存的查询对象的对象标识 就在这条线之后
InquiryRecordEntity inquiry = inquiryRecordRepository.findOne(response.getInquiryId());
inquiry.setStatus(InquiryRecordEntity.InquiryStatus.CONCLUDED);
检查System.identityHashCode(查询)的值-将其另存为objId1
就在这条线之后
InquiryRecordEntity inquiry = inquiryRecordRepository.findOne(response.getInquiryId());
inquiry.setStatus(InquiryRecordEntity.InquiryStatus.CONCLUDED);
检查System.identityHashCode(查询)的值-将其另存为objId2
如果objId1与objId2不同,则您试图用相同的值保存另一个对象,这就是发生插入的原因,任何唯一的键值都会引发ConstraintViolationException。检查代码中发生这种情况的位置并修复此错误。它不应使用/创建其他对象
如果objId1与objId2相同,则操作此对象的状态时出现问题。检查查询对象的id是否已清除。快速检查要保存的查询对象的对象标识 就在这条线之后
InquiryRecordEntity inquiry = inquiryRecordRepository.findOne(response.getInquiryId());
inquiry.setStatus(InquiryRecordEntity.InquiryStatus.CONCLUDED);
检查System.identityHashCode(查询)的值-将其另存为objId1
就在这条线之后
InquiryRecordEntity inquiry = inquiryRecordRepository.findOne(response.getInquiryId());
inquiry.setStatus(InquiryRecordEntity.InquiryStatus.CONCLUDED);
检查System.identityHashCode(查询)的值-将其另存为objId2
如果objId1与objId2不同,则您试图用相同的值保存另一个对象,这就是发生插入的原因,任何唯一的键值都会引发ConstraintViolationException。检查代码中发生这种情况的位置并修复此错误。它不应使用/创建其他对象
如果objId1与objId2相同,则操作此对象的状态时出现问题。检查查询对象的id是否已被清除。您能否从“这里发生了一堆事情,对查询对象进行了更改”中找到一些代码?看起来问题可能就在那里。你为什么首先打电话给save?实体是被管理的,因此它的状态是自动保存的。我不能,但是我再次查看了它,意识到查询对象实际上从未更改过,直到最后的那个条件。中间的代码只决定“查询完成”的值,JBNEZET是吗?我没有看到任何迹象表明这一点。不管怎样,它都应该起作用,对吗?我目前正在进行测试,看看它是否真的在我的代码库中运行。只是做了一个测试,事实并非如此。你能透露一些“这里发生了很多事情,对查询对象进行了修改”中的代码吗?看起来问题可能就在那里。你为什么首先打电话给save?实体是被管理的,因此它的状态是自动保存的。我不能,但是我再次查看了它,意识到查询对象实际上从未更改过,直到最后的那个条件。中间的代码只决定“查询完成”的值,JBNEZET是吗?我没有看到任何迹象表明这一点。不管怎样,它都应该起作用,对吗?我目前正在进行测试,看看它是否真的在我的代码库中运行。只是做了一个测试,事实并非如此。你能透露一些“这里发生了很多事情,对查询对象进行了修改”中的代码吗?看起来问题可能就在那里。你为什么首先打电话给save?实体是被管理的,因此它的状态是自动保存的。我不能,但是我再次查看了它,意识到查询对象实际上从未更改过,直到最后的那个条件。中间的代码只决定“查询完成”的值,JBNEZET是吗?我没有看到任何迹象表明这一点。不管怎样,它都应该起作用,对吗?我目前正在进行测试,看看它是否真的在我的代码库中运行。只是做了一个测试,情况并非如此。