【问题标题】:Java Entity: Either manually setId or autogenerate from sequenceJava 实体:手动设置 ID 或从序列自动生成
【发布时间】: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);
}

我有两种情况:

  1. 创建时,使用实体中定义的序列自动生成 reqId。
  2. 更新时,手动增加修订号并使用相同的 reqId 保存新实体。

对于案例 1,它运行良好,但在案例 #2 中,它使用自动生成的序列覆盖 reqId。

有什么方法可以手动设置 ID 以使生成器不会覆盖它?

【问题讨论】:

    标签: java spring spring-boot micronaut


    【解决方案1】:

    由于您使用的是GenerationType.IDENTITY,因此您将无法对特定属性使用setter。它不会起作用。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多