【发布时间】:2020-01-18 18:28:38
【问题描述】:
我正在使用 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
}
基本实体.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;
}
Repository.java
@Repository
public interface Repositorty extends JpaRepository<CustomersEntity, UUID> {
}
当我们试图保存上述实体时:
repository.save(customerEntity)
将作为新记录保留在数据库中。任何建议都是有帮助的。我在想这是因为父类的 createdTime 和 updatedTime 吗?如果是,我们如何避免这种情况? TIA。
【问题讨论】:
-
可能是因为每条记录都有新的 ID
UUID customerid;如果你想更新记录,那么你有相同的id -
@Deadpool 如果我的理解是正确的,jpa 会在创建新的 UUID 之前检查是否相等?如果对象相同,它应该只更新记录而不是创建新记录?如果我错了,你能纠正我吗?
-
我不确定,但你可以尝试使用现有的 id 看看它是否更新@ging
-
@Deadpool 不,它只是在数据库中创建一个新行。
-
是 createdTime 没有设置的问题吗?因为我在我的机器上尝试了你的代码,并且它为给定的客户 ID 更新了同一行,正如@Deadpool 已经说过的那样。
标签: java hibernate spring-boot jpa spring-data