Java 嵌套异常为org.hibernate.id.IdentifierGenerationException:在调用save()之前,必须手动分配此类的id:
我在Hibernate和一对一映射方面遇到了一些问题 我的DTO类是这样的: 顾客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;
@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"
}]
}