如何避免 Postgres 数据库中的重复条目?条目包含不同的值
Posted
技术标签:
【中文标题】如何避免 Postgres 数据库中的重复条目?条目包含不同的值【英文标题】:How to avoid duplicate entries in Postgres database? Entries contain varying value 【发布时间】:2018-04-17 19:00:01 【问题描述】:实体存储方法:
PoolDef poolDef = new PoolDef();
poolDef.setDate_from(date);
poolDef.setName(poolList.getPoolList().get(i).getName());
poolDefRepository.save(poolDef);
实体本身:
@Setter
@Getter
@EqualsAndHashCode(of = "Id")
@Transactional
@Entity
public class PoolDef
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
private String name;
@Column(name = "date_from", columnDefinition = "timestamp with time zone not null")
private OffsetDateTime date_from;
唯一不同的值是date_from
。我不知道,为什么新条目被添加到数据库中,而不仅仅是更新。我有基于主要Id
键构建的@EqualsAndHashcode
,因此date_from
应该无关紧要。每个方法调用都会创建一个新条目,其中包含一个全新的 Id
...
【问题讨论】:
您创建新实体并将其保存到数据库。为什么它不应该有新的 ID? 来自CRUD repository
的save
方法是这样编码的,如果实体是新的,它将在EntityManager
上调用persist
。否则为merge
。我有一个自定义EqualsAndHashCode
,所以它应该被视为相同,不是吗?我是初学者,所以请证明我错了。
你是对的。从您的代码中,您的实体是新的。 PoolDef poolDef = new PoolDef();
你的 EqualsAndHashCode
使任何具有相同 ID 的实例都等于。
【参考方案1】:
你的问题是你的
GenerationType.IDENTITY
文档说:
表示持久化提供者必须为 使用数据库标识列的实体。
现在的关键问题是,生成了什么 SQL。能否请您跟踪生成的插入 SQL?
另外我更喜欢使用 SEQUENCES 的数据库。因此,我不必弄乱持久性提供程序的身份,如果您将数据库的 SEQUENCES 用于您的 ID/主键列,那么任何应用程序对数据库的行为都会相同。
还有一个问题可能是您用于创建表的 DDL,但我假设您知道如何使用给定的约束定义数据库表。
【讨论】:
以上是关于如何避免 Postgres 数据库中的重复条目?条目包含不同的值的主要内容,如果未能解决你的问题,请参考以下文章
Swift:如何避免 CoreData 中的重复条目以使用 JSON 数组实现?
如何在 Swift 中使用区分大小写和不区分大小写的混合字符串避免 Array 中的重复条目?