【问题标题】:how to generate sequence id in composite primary with @IdClass in springboot hibernate如何在springboot hibernate中使用@IdClass在复合主中生成序列ID
【发布时间】:2019-09-08 16:26:25
【问题描述】:

我在 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)

同样的问题已经发布在Sequences with composite primary key
但是我想知道,最新版本的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  

【问题讨论】:

    标签: hibernate jpa autogeneratecolumn


    【解决方案1】:

    看看@GenericGenerator,它本质上允许您在生成序列值时访问实体实例和Hibernate 的Session。这样,您可以查询表中是否存在您将要插入的其他(非生成)键的组合并采取相应措施。

    【讨论】:

      【解决方案2】:

      我在当前项目中遇到了同样的问题但是花了几个小时之后。它对我有用,这也很有帮助。

      如果 @GenericGenerator 行与您的方案不相关,请将其注释掉。 (在我的例子中,GenericGenerator 实现类在关键字段中插入序列之前附加一个字符串。)

      ClientEntity 包含一个复合主键(ma​​nager_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<>();
      

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 1970-01-01
        • 2012-04-09
        • 2011-11-28
        • 2019-05-04
        • 2014-11-10
        • 1970-01-01
        • 2013-02-26
        • 2014-06-17
        相关资源
        最近更新 更多