hibernate - JPA/Hibernate 事务问题
问题描述
我希望我可以使用选项 TABLE 生成主键,但我不明白为什么事务不起作用。这是我的环境(这是一个例子,不是真正的应用程序,但它会更容易解释):
SGBD:MySql
数据库:emp、job、department(Oracle 示例)和 pkeys 用于生成主键
ORM:带有休眠的 JPA
企业应用:EmployeeJPA 有 2 个模块:EmployeeJPA-ejb 和 EmployeeJPA-war
EJB 实体:员工
@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 Session 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;
}
}
}
Servlet 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);
}
}
之前的表 pkeys
之后的表 pkeys
表employee的最后一个id是14
请求错误消息:
休眠:从部门department0_中选择department0_.department_id作为departmentme1_0_0_,department0_.dname作为dname2_0_0_,department0_.location作为location3_0_0_,其中department0_.department_id=?
休眠:从作业job0_中选择job0_.job_id作为job_id1_2_0_,job0_.jobname作为jobname2_2_0_,其中job0_.job_id=?
休眠:从 pkeys 中选择 pkey_val,其中 pkey_id = 'EMPLOYEE' 进行更新
休眠:更新 pkeys 设置 pkey_val = ? pkey_val = 哪里?和 pkey_id = 'EMPLOYEE'
Hibernate:插入员工(department_id,hiredate,job_id,manager_id,name,salary,employee_id)值(?,?,?,?,?,?,?)
SQL 错误:1062,SQL 状态:23000
键“PRIMARY”的重复条目“14”
似乎不仅有一笔交易,而且还有两笔交易,但我不明白为什么!我的错误在哪里?谢谢你的帮助 !
解决方案
推荐阅读
- email - 在哪里可以找到随发票发送给客户的电子邮件模板?
- typescript - 打字稿无法读取未定义的属性
- database - bibliometrix(上传数据的问题)
- cloud - TensorFlow 谷歌云教程
- javascript - Javascript setTimeout 和 clearTimeout 如果单击按钮不起作用,则继续执行其余功能
- android - Espresso 在 RecyclerView 中查找可能不在屏幕上的行
- laravel - 将参数传递给数据表的每一列
- excel - Excel VBA 使用 for 循环创建下标错误
- javascript - javascript:每次调用api与存储在数据库中
- ssh - 如何正确定向到具有多台机器(因此多个 SSH 服务器)的 LAN 的公共 IP 地址的传入 SSH 连接请求?