关于java:Spring-Data JPARepository保存方法创建重复的Record

Spring-Data JPARepository save method creates a duplicate Record

我正在使用spring-data和hibernate创建表并插入数据。 从不同的线程中,我发现JPARepository(来自CRUDRepository)的save方法仅在记录已存在的情况下才更新记录。 以下是我发现一些信息的线程之一:

https://stackoverflow.com/a/40608937/10356053

我有一个实体,它正在复制记录(即使对象相同,jpa也会考虑将其作为新插入)。 我不太确定发生了什么或该问题的解决方案。 任何建议表示赞赏。 以下是我创建的实体:

CustomerEntity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
@Table(name ="Customers")
@Entity
public class CustomersEntity extends BasicEntity {
      @Id
     @GeneratedValue(generator ="UUID")
     @GenericGenerator(name ="UUID", strategy ="org.hibernate.id.UUIDGenerator")
     @Column(name ="CustomerId", updatable = false, nullable = false)
     private UUID customerid;

     //and some other fields
}

BasicEntity.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
public class BasicEntity implements serializable {
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name ="created_at", updatable = false)
    @CreatedDate
    private Date createdAt;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name ="updated_at")
    @LastModifiedDate
    private Date updatedAt;
}

仓库.java

1
2
3
4
5
@Repository
public interface Repositorty extends JpaRepository<CustomersEntity, UUID> {


}

当我们尝试保存上述实体时:

1
repository.save(customerEntity)

将作为新记录保留在数据库中。 任何建议都是有帮助的。 我在想这是由于父类的createdTime和updatedTime吗? 如果是,我们如何避免这种情况? TIA。


columnDefinition ="BINARY(16)"添加到customerid的@Column属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
@Table(name ="Customers")
@Entity
public class CustomersEntity extends BasicEntity {
      @Id
     @GeneratedValue(generator ="UUID")
     @GenericGenerator(name ="UUID", strategy ="org.hibernate.id.UUIDGenerator")
     @Column(name ="CustomerId", updatable = false, nullable = false, columnDefinition ="BINARY(16)")
     private UUID customerid;

     //and some other fields
}

没有它,customer_id列将使用256个字节(在MySQL中),这很可能导致UUID公式在随后保存相同实体对象(解释重复创建)时失败。

详细信息:休眠和UUID标识符