【发布时间】:2021-07-17 09:23:23
【问题描述】:
我有一个使用@IdClass 的复合键实体,如下所示:
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
@IdClass(MyId.class)
@SequenceGenerator(
name = "My_SEQUENCE",
initialValue = 1,
allocationSize = 1
)
public class MyEntity implements Serializable {
@Id
@Column(name = "id")
@GenericGenerator(
name = "MY_SEQUENCE",
strategy = "StringPrefixedSequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "1"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "ABC"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%07d") })
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "MY_SEQUENCE")
private String reqId;
@Id
@Column(name = "rev_no")
private Long revisionNumber;
...
}
而且,它的存储库为:
@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
}
在我的服务中,我想关注:
public class MyEntityService extends BaseService<MyEntityRepository, MyEntity, Long> {
@Transactional
public MyEntity create(Payload payload) {
...
myEntity.setRevisionNumber(1);
myEntityRepository.save(myEntity);
...
}
public MyEntity update(String reqId, Long revisionNumber, Payload payload) {
var myEntity = findByIdAndRevisionNumber(reqId, revisionNumber);
...
myEntity.setRevisionNumber(revisionNumber + 1);
myEntity.setReqId(reqId);
myEntityRepository.save(myEntity);
}
我有两种情况:
- 创建时,使用实体中定义的序列自动生成 reqId。
- 更新时,手动增加修订号并使用相同的 reqId 保存新实体。
对于案例 1,它运行良好,但在案例 #2 中,它使用自动生成的序列覆盖 reqId。
有什么方法可以手动设置 ID 以使生成器不会覆盖它?
【问题讨论】:
标签: java spring spring-boot micronaut