字符串和枚举类型变量的复合主键
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
如何为 source
和 transactionId
定义复合主键并从代码
中删除 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
这是我的交易实体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
如何为 source
和 transactionId
定义复合主键并从代码
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