Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在springboot hibernate中使用@IdClass在复合主中生成序列id_Hibernate_Jpa_Autogeneratecolumn - Fatal编程技术网

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

如何在springboot hibernate中使用@IdClass在复合主中生成序列id,hibernate,jpa,autogeneratecolumn,Hibernate,Jpa,Autogeneratecolumn,我正在SpringBootHibernate中实现一个带有自动生成注释的复合主键。以下是场景: 科目表包含以下列: stateCode、branchCode、prodCode、subdocode、accountNumber 每当stateCode、branchCode、prodCode和SubCode发生更改时,表Account都应该有新的accountNumber 例如: stateCode,branchCode,prodCode,subProdCode,accountNumber 11,01

我正在SpringBootHibernate中实现一个带有自动生成注释的复合主键。以下是场景:

  • 科目表包含以下列:
    stateCode、branchCode、prodCode、subdocode、accountNumber
  • 每当stateCode、branchCode、prodCode和SubCode发生更改时,表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是否引入了任何新功能

    下面是我已经实现的代码:

    @实体
    @资料
    @AllArgsConstructor
    @诺尔格构装师
    @EqualsAndHashCode(callSuper=false)
    @IdClass(CompositeId.class)
    公共类复合计数{
    私人城市;
    私有字符串名称;
    @身份证
    @生成值
    私人长途电话号码;
    @身份证
    私有字符串状态码;
    @身份证
    私有字符串分支代码;
    @身份证
    私有字符串代码;
    @身份证
    私有字符串子代码;
    }
    @资料
    @AllArgsConstructor
    @诺尔格构装师
    @EqualsAndHashCode(callSuper=false)
    公共类CompositeId实现可序列化{
    私有字符串状态码;
    私有字符串分支代码;
    私有字符串代码;
    私有字符串子代码;
    私人长途电话号码;
    }
    
    我使用上述代码得到以下结果:

    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的
    会话。通过这种方式,您可以查询表中是否存在要插入的其他(未生成的)键的组合,并相应地执行操作

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

    如果与您的场景不相关,请注释掉@GenericGenerator行。(在我的例子中,GenericGenerator实现类在键字段中插入序列之前追加字符串。)

    客户实体包含一个复合主键(经理id+客户id

    ClientId-复合密钥实体。

        public class ClientId implements Serializable {
    
            private String clientId;
    
            private String managerId;
    
            // Getter and Setter
        }
    
    和管理性-

        @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<>();
    
    @Entity(name=“portfolioManager”)
    @表(name=“投资组合经理”)
    公共类ManagerEntity实现了可序列化{
    @身份证
    @列(name=“manager\u id”,长度=50,可空=false)
    @GeneratedValue(策略=GenerationType.SEQUENCE,generator=“投资组合经理”)
    @通用生成器(
    name=“投资组合经理”,
    strategy=“com.abc.api.utils.StringPrefixedSequenceIdGenerator”,
    参数={
    @org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.INCREMENT_PARAM,value=“50”),
    @org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.VALUE_PREFIX_参数,VALUE=“MNG”),
    @org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.NUMBER_FORMAT_参数,value=“%06d”)})
    私有字符串管理器;
    @列(name=“manager\u name”,长度=100)
    私有字符串管理器名称;
    @OneToMany(fetch=FetchType.LAZY,mappedBy=“manager”)
    受保护的列表客户端=新的ArrayList();
    
        @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<>();