代码之家  ›  专栏  ›  技术社区  ›  denstran

休眠未生成正确的id

  •  0
  • denstran  · 技术社区  · 2 年前

    我正在开发我的spring-boot项目,并使用data.sql文件将一些测试数据加载到我的数据库中。我正在使用内存DB中的H2。问题是,当我试图使用我的应用程序添加一些数据时,hibernate设置 default paramentr在我应该在的地方。正因为如此,我有这个例外:

    Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.COMPANY_BRANCH(ID) ( /* key:1 */ CAST(1 AS BIGINT), '500000 RUB', 'Rosebank', 'South Africa', '987-364-9956', 'Bultman', '7945')"; SQL statement:
    insert into company_branch (company_branch_budget,company_branch_city,company_branch_country,company_branch_street,company_branch_zip_code,company_branch_phone_number,id) values (?,?,?,?,?,?,default) [23505-214]
    

    这是查询休眠生成

    insert 
        into
            company_branch
            (company_branch_budget,company_branch_city,company_branch_country,company_branch_street,company_branch_zip_code,company_branch_phone_number,id) 
        values
            (?,?,?,?,?,?,default)
    

    看起来它设置为默认id 1,但这个id已经被data.sql文件中的第一行占用了。

    这是我的EntityClass:

    @Entity
    @Table(name = "COMPANY_BRANCH")
    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public class CompanyBranch {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @NotNull
        @Convert(
                converter = MoneyConverter.class
        )
        @Column(name = "COMPANY_BRANCH_BUDGET", length = 63)
        private Money budget;
    
        @Embedded
        @NotNull
        @AttributeOverrides({
                @AttributeOverride(name = "city",
                    column = @Column(name = "COMPANY_BRANCH_CITY")),
                @AttributeOverride(name = "zipCode",
                    column = @Column(name = "COMPANY_BRANCH_ZIP_CODE")),
                @AttributeOverride(name = "street",
                    column = @Column(name = "COMPANY_BRANCH_STREET")),
                @AttributeOverride(name = "country",
                column = @Column(name = "COMPANY_BRANCH_COUNTRY"))
        })
        private Address companyBranchAddress;
    
        @NotNull
        @NotBlank(message = "Номер телефона не должен быть пустым")
        @Pattern(regexp = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$",
                message = "Неверный формат номера!")
        @Column(name = "COMPANY_BRANCH_PHONE_NUMBER")
        private String phoneNumber;
    
    
        @OneToMany(mappedBy = "companyBranch", cascade = CascadeType.ALL)
        private Set<Department> departments = new HashSet<>();
    
        public void addDepartment(Department department) {
            this.departments.add(department);
            department.setCompanyBranch(this);
        }
    
        public void removeDepartment(Department department) {
            this.departments.remove(department);
            department.setCompanyBranch(null);
        }
    }
    

    这是我的dto课

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class CompanyBranchDTO {
        private Long id;
    
        @NotNull
        @Valid
        private Money budget;
    
        @NotNull
        @Valid
        private Address companyBranchAddress;
    
        @NotNull
        @NotBlank(message = "Номер телефона не должен быть пустым")
        @Pattern(regexp = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$",
                message = "Неверный формат номера!")
        private String phoneNumber;
        private Set<DepartmentDTO> departments;
    }
    

    我的控制器就是这样工作的

    @GetMapping("/new")
        public String createBranch(Model model) {
            CompanyBranchDTO companyBranchDTO = new CompanyBranchDTO();
    
            model.addAttribute("companyBranchDTO", companyBranchDTO);
            return "createCompanyBranch";
        }
    
        @PostMapping("/new")
        public String createBranchPost(@ModelAttribute("companyBranchDTO") @Valid CompanyBranchDTO companyBranchDTO,
                                       BindingResult bindingResult) {
            if (bindingResult.hasErrors()) return "createCompanyBranch";
    
            CompanyBranch companyBranchEntity = companyBranchMapper.toEntity(companyBranchDTO);
            companyBranchService.createOrUpdateCompanyBranch(companyBranchEntity);
    
            return "redirect:/companyBranches";
        }
    

    它从html表单中获取dto,然后将其转换为实体。这就是在我的服务类中保存实体的方式

    public CompanyBranch createOrUpdateCompanyBranch(CompanyBranch companyBranch) {
            return  companyBranchRepository.saveAndFlush(companyBranch);
        }
    

    我认为这个问题是以某种方式连接到我的data.sql文件上的,但我不知道如何连接。也许有人知道答案?我会非常感激的。

    0 回复  |  直到 2 年前
        1
  •  0
  •   denstran    2 年前

    感谢叶夫根尼·梁扎诺夫和Mar-Z的帮助链接( first , second )。正如我在评论中所说,问题出在我的data.sql文件中,简而言之,我需要从那里删除id插入,因为它不允许生成正确的id。