【发布时间】:2018-02-16 01:58:12
【问题描述】:
首先,我不会考虑记录的主 ID。我说的是用户用来识别自动生成但用户可更改的记录的字段,不是顺序的,也不是 UUID。例如,从帐户实体开始:
@Entity
@Data
class Account {
@Id
@GeneratedValue
private int id;
@Column(unique=true)
@NotNull
private String slug;
@Column
private String name;
}
然后我简单地创建一个记录:
@Autowired
private AccountRepository accountRepository;
Account account = new Account();
account.setName("ACME");
accountRepository.saveAndFlush(account);
此时,slug 应该已经生成,或者完全随机生成,或者根据名称进行操作。应该怎么做?
我知道如果不锁定整个表,就不可能确保插入不会由于违反唯一性约束而导致异常。我实际上可以阻止整个表甚至让异常发生(您需要每秒大量请求才能在检查可用性和插入之间发生冲突)。
【问题讨论】:
-
java.util.UUID#randomUUID 怎么样?
-
您为什么不覆盖
AccountRepository的save()并在此处应用生成唯一属性的逻辑?为什么需要在回调中做呢? -
@Pablo 你可以看看这里:stackoverflow.com/questions/13036159/…。我认为您应该决定是否要为数据访问层使用存储库或 DAO 模式。
-
您并没有尝试对 Active Record 特定进行任何操作,但您的思维方式就像是在使用 Active Record。你很惊讶它比 Active Record 更难。您正在将您已完成并作为库发布的内容与您将使用具有不同设计理念的不同技术创建的内容进行比较。
-
比较一个实现 (ActiveRecord) 与一个 API (JPA) 比较不稳定。 JPA 的任何实现——Hibernate、EclipseLink、OpenJPA,都可能确实提供您所追求的功能; JPA 规范只关注所有实现需要以兼容方式提供的 ORM 方面。您必须查看他们的文档才能了解真正可用的内容。