【问题标题】:Composite primary key for a String and an enum type variable字符串和枚举类型变量的复合主键
【发布时间】:2020-11-13 03:44:33
【问题描述】:

这是我的交易实体类

@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 变量

【问题讨论】:

    标签: java spring-boot spring-data-jpa spring-data


    【解决方案1】:

    再创建一个类,然后您可以将其用作主键。为此,您必须使用@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 2014-07-23
      • 2018-09-20
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多