簡體   English   中英

如何在springboot hibernate中使用@IdClass在復合主中生成序列ID

[英]how to generate sequence id in composite primary with @IdClass in springboot hibernate

我正在 Spring Boot Hibernate 中實現一個帶有自動生成注釋的復合主鍵。 下面是場景:

  1. 帳戶表具有以下列: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM