Java 嵌套异常为org.hibernate.id.IdentifierGenerationException:在调用save()之前,必须手动分配此类的id:

Java 嵌套异常为org.hibernate.id.IdentifierGenerationException:在调用save()之前,必须手动分配此类的id:,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我在Hibernate和一对一映射方面遇到了一些问题 我的DTO类是这样的: 顾客 @Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class CustomerDTO { private String nic; private String name; private String address;

我在Hibernate和一对一映射方面遇到了一些问题

我的DTO类是这样的:

顾客

@Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class CustomerDTO {
    
        private String nic;
        private String name;
        private String address;
        private String contact;
        private ArrayList<UserDTO> user = new ArrayList<>();
我的实体类是这样的

顾客

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Customer {

    @Id
    private String nic;
    private String name;
    private String address;
    private String contact;

    @OneToOne(mappedBy = "customer", cascade = CascadeType.ALL)
    private User user;
使用者

CustomerController类

@RestController
    @RequestMapping("/api/v1/customer")
    @CrossOrigin
    public class CustomerController {
        @Autowired
        CustomerService customerService;
    
        @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE})
        public ResponseEntity saveCustomer(@RequestBody CustomerDTO dto){
    
            customerService.saveCustomer(dto);
            StandradResponse success = new StandradResponse(200, "success", null);
            return new ResponseEntity(success, HttpStatus.OK);
    
        }
    
    }
客户服务类

  @Transactional
    @Service
    public class CustomerServiceImpl implements CustomerService {
    
        @Autowired
        CustomerRepo customerRepo;
    
        @Autowired
        UserRepo userRepo;
    
        @Autowired
        ModelMapper mapper;
    
        @Override
        public void saveCustomer(CustomerDTO dto) {
           
    
            if(!customerRepo.existsById(dto.getNic())){
    
                Customer customer = mapper.map(dto, Customer.class);
    
                customerRepo.save(customer);
    
                for (UserDTO ud : dto.getUser()){
                    if(!userRepo.existsById(ud.getEmail())){
    
                       
                        UserDTO userDTO = new UserDTO(ud.getEmail(),ud.getPassword(),ud.getRole(),ud.getLastLogged());
    
                        User user = new User(userDTO.getEmail(), userDTO.getPassword(), userDTO.getRole(), userDTO.getLastLogged(), customer);
                         //User user = mapper.map(userDTO, User.class);
                        userRepo.save(user);
    
                    }else {
    
                        throw  new RuntimeException("Email is already exist!");
                    }
    
                }
    
                
            }else{
    
                throw  new RuntimeException("Customer is already exist!");
    
            }
    
        }
我试图用邮递员发送这些Json值

 {
    
      "nic" : "55665v",
      "name" : "anyname",
      "address" : "no 20,56 text",
      "contact" : "54673453",
    
      "user": [{
    
        "email":"text@gmail.com",
        "password":"1234",
        "role":"driver",
        "lastLogged":"sunday"
      }]

}
每次调用函数时,我都会得到

调用save()之前,必须手动分配此类的ID:lk.EasyCarRental.backend.entity.Customer;嵌套异常为org.hibernate.id.IdentifierGenerationException:调用save()之前必须手动分配此类的id:lk.EasyCarRental.backend.entity.Customer


我不想自动生成id。我不想手动输入id。我不确定
Customer-customerNic=customerRepo.findCustomerByNic(dto.getNic())的目的是什么是,但由于您没有显示,所以很难说发生了什么。您是否尝试过使用在进入循环之前保留的
customer

,因为您正在JSON请求中传递DTO。您可以手动获取id字段,并在保存之前调用实体的setter。
  @Transactional
    @Service
    public class CustomerServiceImpl implements CustomerService {
    
        @Autowired
        CustomerRepo customerRepo;
    
        @Autowired
        UserRepo userRepo;
    
        @Autowired
        ModelMapper mapper;
    
        @Override
        public void saveCustomer(CustomerDTO dto) {
           
    
            if(!customerRepo.existsById(dto.getNic())){
    
                Customer customer = mapper.map(dto, Customer.class);
    
                customerRepo.save(customer);
    
                for (UserDTO ud : dto.getUser()){
                    if(!userRepo.existsById(ud.getEmail())){
    
                       
                        UserDTO userDTO = new UserDTO(ud.getEmail(),ud.getPassword(),ud.getRole(),ud.getLastLogged());
    
                        User user = new User(userDTO.getEmail(), userDTO.getPassword(), userDTO.getRole(), userDTO.getLastLogged(), customer);
                         //User user = mapper.map(userDTO, User.class);
                        userRepo.save(user);
    
                    }else {
    
                        throw  new RuntimeException("Email is already exist!");
                    }
    
                }
    
                
            }else{
    
                throw  new RuntimeException("Customer is already exist!");
    
            }
    
        }
 {
    
      "nic" : "55665v",
      "name" : "anyname",
      "address" : "no 20,56 text",
      "contact" : "54673453",
    
      "user": [{
    
        "email":"text@gmail.com",
        "password":"1234",
        "role":"driver",
        "lastLogged":"sunday"
      }]

}