gpt4 book ai didi

java - Spring-Data JPARepository save 方法创建重复记录

转载 作者:行者123 更新时间:2023-12-02 09:31:02 24 4
gpt4 key购买 nike

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

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

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

CustomerEntity.java:

@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:

@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

@Repository
public interface Repositorty extends JpaRepository<CustomersEntity, UUID> {


}

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

repository.save(customerEntity)

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

最佳答案

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

@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 方程在后续保存同一实体对象时失败,这解释了重复创建。

更多信息:Hibernate and UUID identifiers

关于java - Spring-Data JPARepository save 方法创建重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57981904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com