首页 > 解决方案 > 主键冲突 Java Spring Boot SQL Server

问题描述

在我的项目中,我有 Events 实体和 MyLocation 实体。

MyLocation id 是 event.eventStartTime (ISOString) + event.eventName,当我尝试更新事件名称时遇到问题(不再与 MyLocation 字符串名称相关),这是错误:

 Violation of PRIMARY KEY constraint 'PK__my_locat__72E12F1A88A314B4'. Cannot insert duplicate key in object 'dbo.my_location'. The duplicate key value is (2020-06-25T14:00:01.235ZWeddingT&Z).

这是代码:

@Entity
@Table(name = "Events")
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long eventID;
    @Column(nullable = false)
    private String eventName;
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private MyLocation eventLocation;
    @column
    private TimeStamp eventStartTime;
    ....
@Entity
public class MyLocation {
    @Id
    private String name;
    @Column
    private double longitude;
    @Column
    private double latitude;
    .....

问题是否与 MyLocation 中的 @Id 有关?或任何其他解决方案?

标签: javasqlspring-bootspring-data-jpasql-update

解决方案


似乎您正在尝试重复输入 MyLocation。您是如何生成位置名称的,或者您是否对唯一的位置名称有足够的检查逻辑?

您也可能有一些其他类型作为事件表的主键。像uuid。

@Id
@GeneratedValue(generator = “UUID”)
    @GenericGenerator(
        name = “UUID”,
        strategy = “org.hibernate.id.UUIDGenerator”,
    )
@Column(name = “id”, updatable = false, nullable = false)
private UUID id;

或者你可以有一个自动递增的 id:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

推荐阅读