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();
}
}
在我准备的场景中,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();
}
}