JPA / Hibernate транзакция проблема - PullRequest
2 голосов
/ 17 января 2020

I wi sh Я мог бы сгенерировать первичный ключ с опцией TABLE, и я не понимаю, почему транзакции не работают. Вот мое окружение (это пример, а не истинное приложение, но его будет проще объяснить):

SGBD: MySql

База данных: emp, job, Department (Oracle пример) и pkeys для генерации первичных ключей

ORM: JPA с Hibernate

Корпоративное приложение: EmployeeJPA с 2 модулями: EmployeeJPA-ejb и EmployeeJPA-war

EJB Entity : Employee

@Entity
@Table(name = "employee")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"),
    @NamedQuery(name = "Employee.findByEmployeeId", query = "SELECT e FROM Employee e WHERE e.employeeId = :employeeId"),
    @NamedQuery(name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :name"),
    @NamedQuery(name = "Employee.findByManagerId", query = "SELECT e FROM Employee e WHERE e.managerId = :managerId"),
    @NamedQuery(name = "Employee.findByHiredate", query = "SELECT e FROM Employee e WHERE e.hiredate = :hiredate"),
    @NamedQuery(name = "Employee.findBySalary", query = "SELECT e FROM Employee e WHERE e.salary = :salary")})
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @TableGenerator(name="EmployeePk", table="pkeys", pkColumnName="pkey_id",
            valueColumnName="pkey_val", pkColumnValue="EMPLOYEE", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.TABLE, generator="EmployeePk")    
    @Basic(optional = false)
    @NotNull
    @Column(name = "employee_id")
    private Integer employeeId;
    . . .

EJB-сессия EmployeeFacade

@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.CONTAINER)
public class EmployeeFacade {
    @PersistenceContext(unitName = "EmployeesJPA-ejbPU")
    private EntityManager em;
    @EJB
    JobFacade jobFacade;
    @EJB
    DepartmentFacade departmentFacade;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void addEmployee(String name, Date hiredate, double salary, int jobId, int departmentId, int managerId) throws Exception {
        Employee employee = new Employee();
        try{
            Department department = departmentFacade.getDepartmentById(departmentId);
            Job job = jobFacade.getJobById(jobId);
            employee.setDepartment(department);
            employee.setJob(job);
            employee.setHiredate(hiredate);
            employee.setManagerId(managerId);
            employee.setName(name);
            em.persist(employee);
        }catch(Exception ex){
            throw ex;
        }
    }
}

Сервлет SrvlEmployee

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String error = null;
    try {
        Date hiredate = Utilitaire.StrToDate("2020-02-01", "yyyy-MM-dd");
        employeeFacade.addEmployee("Smith", hiredate, 2000.00, 2, 3, 4);
    } catch (Exception e) {
        error = Utilitaire.getExceptionCause(e);
    } finally {
        request.setAttribute("errorR", error);
        RequestDispatcher dsp = request.getRequestDispatcher("/index.jsp");
        dsp.forward(request, response);
    }
}

Таблица указывается перед

The table before inserting an employee

Таблица указывается после

The table after inserting an employee

Последний идентификатор сотрудника таблицы: 14

запрашивает сообщение об ошибке:

Hibernate: выберите департамент 0_.department_id как департамент_1_0_0, отдел 0_.dname как имя_данных2_0_0_, отдел 0_ расположение_3_0_0_ из отдела 0, где отдел 0_.department_id =?

Hibernate: выбрать: job0_.job_id as job_id1_2 _0_, job0_.jobname как jobname2_2_0_ из job job0_, где job0_.job_id =?

Hibernate: выберите pkey_val из pkeys, где pkey_id = 'EMPLOYEE' для обновления

Hibernate: обновить набор ключей pkey_val =? где pkey_val =? и pkey_id = 'EMPLOYEE'

Hibernate: вставить в значения сотрудника (Department_id, hiredate, job_id, manager_id, name, salary, employee_id) (?,?,?,?,?,?,?)

SQL Ошибка: 1062, SQLState: 23000

Дублирующая запись '14' для ключа 'PRIMARY'

Кажется, что существует не одна транзакция, а две, но я не не понимаю почему! Где моя ошибка? Спасибо за вашу помощь!

...