0

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

2 回答 2

0

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

如果与您的方案无关,请注释掉@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<>();
于 2020-04-30T12:44:22.260 回答
0

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

于 2019-09-08T21:09:30.677 回答