[英]how to generate sequence id in composite primary with @IdClass in springboot hibernate
我正在 Spring Boot Hibernate 中實現一個帶有自動生成注釋的復合主鍵。 下面是場景:
stateCode,branchCode,prodCode,subProdCode,accountNumber
每當 stateCode,branchCode,prodCode,subProdCode 發生變化時,表 Account 應該有新的 accountNumber 。
例如:
stateCode,branchCode,prodCode,subProdCode,accountNumber
11,01,20,1,00001
11,01,30,1,00001 (there is a change in prodCode)
11,01,30,2,00001 (there is a change in subprodcode)
11,01,20,2,00001 (there is a change in prod & subprodcode)
11,01,20,1,00002 (prodcode,subprod code has already account number 00001 ,
now it should be 00002)
同樣的問題已經發布在帶有復合主鍵的序列上
但我想知道,在最新版本的 spring boot hibernate 中是否引入了任何新功能。
下面是我已經實現的代碼:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@IdClass(CompositeId.class)
public class CompositeAccountNumber {
private String city;
private String custName;
@Id
@GeneratedValue
private Long accNumber;
@Id
private String stateCode;
@Id
private String branchCode;
@Id
private String prodCode;
@Id
private String subProdCode;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class CompositeId implements Serializable {
private String stateCode;
private String branchCode;
private String prodCode;
private String subProdCode;
private Long accNumber;
}
我用上面的代碼得到以下結果:
stateCode,branchCode,prodCode,subProdCode,accountNumber
11,01,20,1,00001
11,01,30,1,00002
11,01,30,2,00003
11,01,20,2,00004
11,01,20,1,00005
看看@GenericGenerator
,它本質上允許您在生成序列值時訪問實體實例和 Hibernate 的Session
。 通過這種方式,您可以查詢表中是否存在您將要插入的其他(非生成)鍵的組合並相應地采取行動。
我在當前項目中遇到了同樣的問題但是花了幾個小時之后。 它對我有用,這也會有幫助。
如果@GenericGenerator行與您的場景不相關,請將其注釋掉。 (在我的例子中,GenericGenerator 實現類在鍵字段中插入序列之前附加一個字符串。)
ClientEntity 包含一個復合主鍵( manager_id + client_id )
@Entity(name = "clientMaster")
@Table(name = "clientMaster")
@IdClass(ClientId.class)
public class ClientEntity implements Serializable {
/**
* Generated serial version UID
*/
private static final long serialVersionUID = 2716239938412051148L;
@Id
@Column(name = "client_id",length = 50,nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENTMASTER_SEQ")
@GenericGenerator(
name = "CLIENTMASTER_SEQ",
strategy = "com.abc.api.utils.StringPrefixedSequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "CNT"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%06d") })
private String clientId;
@Id
@Column(name = "manager_id")
private String managerId;
@ManyToOne
@JoinColumn(name = "manager_id", insertable = false, updatable = false)
protected ManagerEntity manager;
// Getter & Setter
}
ClientId - 復合鍵實體。
public class ClientId implements Serializable {
private String clientId;
private String managerId;
// Getter and Setter
}
和 ManagerEntity -
@Entity(name = "portfolioManager")
@Table(name = "portfolio_manager")
public class ManagerEntity implements Serializable {
@Id
@Column(name = "manager_id",length = 50,nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PORTFOLIO_MANAGER_SEQ")
@GenericGenerator(
name = "PORTFOLIO_MANAGER_SEQ",
strategy = "com.abc.api.utils.StringPrefixedSequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "MNG"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%06d") })
private String managerId;
@Column(name = "manager_name",length = 100)
private String managerName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "manager")
protected List<ClientEntity> clients = new ArrayList<>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.