EntityManager 正在阻止数据库触发器

EntityManager is blocking the database trigger

在我准备的场景中,jpa锁定了新记录。因此,数据库中的触发器未激活。我该如何解决这种情况?

当我创建客户时,触发器将代码分配给客户。但是,由于在此过程中创建的记录被锁定,因此触发器未被激活。

@Entity
public class Customer {
    @Id
    @Column
    private int id;
    @Column
    private String name;
    @Column
    private String address;
    @Column
    private int personRef;
    @Column
    private int customerCode; //db trigger updated
}

@Entity
public class Person {
    @Id
    @Column
    private int id;
    @Column
    private String name;
    @Column
    private String surname;

}


public class CustomerDTO {

    private int id;
    private String name;
    private String address;
    private int personRef;
    private PersonDTO person;
}


public class PersonDTO {
    private int id;
    private String name;
    private String surname;

}

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer>{
    
}

@Service
public class CustomerService{
    @Autowired
    private final CustomerRepository customerRepository;
    @Autowired
    private final PersonService personService;
    
    @Transactional(rollbackFor = {Exception.class})
    public int control(CustomerDTO customerDTO){
         Customer customer =  customerRepository.findById(customerDTO.getId());
         if(customer == null){
             ModelMapper mapper = new ModelMapper();
              customer =  mapper.map(customer,Customer.class);
             customerRepository.saveAndFlush(customer);
             Person person = mapper.map (customer.getPerson(),Person.class);
             personService.saveAndFlush(person);
             customer =  customerRepository.findById(customerDTO.getId());
             customer.setPersonRef(person.getId());
             customerRepository.saveAndFlush(customer);
             return customer.getCustomerCode;
             
         }
         return customer.getCustomerCode();
    
    }
    
}

问题是触发器在数据库中运行而 Hibernate 不知道。

因此您必须在触发器运行后刷新实体:

@Service
public class CustomerService{
    @Autowired
    private final CustomerRepository customerRepository;
    @Autowired
    private final PersonService personService;
    @Autowired
    private EntityManager em;

    @Transactional(rollbackFor = {Exception.class})
    public int control(CustomerDTO customerDTO){
         Customer customer =  customerRepository.findById(customerDTO.getId());
         if(customer == null){
             ModelMapper mapper = new ModelMapper();
              customer =  mapper.map(customer,Customer.class);
             customerRepository.saveAndFlush(customer);
             Person person = mapper.map (customer.getPerson(),Person.class);
             personService.saveAndFlush(person);
             customer =  customerRepository.findById(customerDTO.getId());
             customer.setPersonRef(person.getId());
             customerRepository.saveAndFlush(customer);

             // Reload the data from the database
             em.refresh(customer);

             return customer.getCustomerCode;
             
         }
         return customer.getCustomerCode();
    
    }
    
}