首页 > 解决方案 > 字符串和枚举类型变量的复合主键

问题描述

这是我的交易实体类

@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

如何为代码定义复合主键source并从代码transactionId中删除id变量

标签: javaspring-bootspring-data-jpaspring-data

解决方案


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

你的班:

public class Transaction{

    @EmbeddedId
    private TransactionPK primaryKey;

    ... other fields, getters and setters

用作主键的新类:

@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

推荐阅读