字符串和枚举类型变量的复合主键

Composite primary key for a String and an enum type variable

这是我的交易实体class

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Transaction{

    @Id
    private int id;

    @NotNull
    @Enumerated(EnumType.STRING)
    private TransactionSourceEnum source;

    @NotNull
    @Column(unique = true)
    private String transactionId;

    private String switchingId;

    @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
    private LocalDateTime requestDate;


    private String status;

}

这是存储库

public interface TransactionRepository extends JpaRepository<Transaction, Integer> {

    Transaction findByTransactionIdAndTransactionSource(String transactionId, TransactionSourceEnum transactionSource);

    @Modifying(clearAutomatically = true)
    @Transactional
    @Query(value = "DELETE FROM transaction WHERE transaction_cre_sys_date <= (now() - interval 6 month)",nativeQuery = true)
    void deleteSixMonthOldTransactions();

    void deleteByTransactionCreSysDateBefore(LocalDateTime date);

    Boolean existsByTransactionId(String transactionId);

}

当我尝试用 @Id 注释 transactionSourceEnum 时,它说

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Composite-id class must implement Serializable: com.adl.et.telco.xlbss.paymentservice.domain.entities.Transaction

如何为 sourcetransactionId 定义复合主键并从代码

中删除 id 变量

再创建一个 class,然后您可以将其用作主键。为此,您必须使用 @EmbeddedId

你的class:

public class Transaction{

    @EmbeddedId
    private TransactionPK primaryKey;

    ... other fields, getters and setters

新class用作主键:

@Embeddable
public class TransactionPK implements Serializable{

    // create your own serialVersionUID from your IDE if it asks
    private static final long serialVersionUID = 6202269445639364170L;

    @NotNull
    @Enumerated(EnumType.STRING)
    private TransactionSourceEnum source;

    @NotNull
    @Column(unique = true)
    private String transactionId;

    ...getters and setters