Java JPA插入错误
我正在学习JPA,我有一个问题。 我有以下实体: 雇员:Java JPA插入错误,java,mysql,jpa,Java,Mysql,Jpa,我正在学习JPA,我有一个问题。 我有以下实体: 雇员: @Entity @Table(name="employees") @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e") public class Employee implements Serializable { @Id @Column(name="emp_no") private int empNo; @Temporal(Tempor
@Entity
@Table(name="employees")
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable {
@Id
@Column(name="emp_no")
private int empNo;
@Temporal(TemporalType.DATE)
@Column(name="birth_date")
private Date birthDate;
@Column(name="first_name")
private String firstName;
private String gender;
@Temporal(TemporalType.DATE)
@Column(name="hire_date")
private Date hireDate;
@Column(name="last_name")
private String lastName;
//bi-directional many-to-one association to DeptEmp
@OneToMany(mappedBy="employee")
private List<DeptEmp> deptEmps;
public Employee() {
}
public int getEmpNo() {
return this.empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public Date getBirthDate() {
return this.birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getGender() {
return this.gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getHireDate() {
return this.hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<DeptEmp> getDeptEmps() {
return this.deptEmps;
}
public void setDeptEmps(List<DeptEmp> deptEmps) {
this.deptEmps = deptEmps;
}
public DeptEmp addDeptEmp(DeptEmp deptEmp) {
getDeptEmps().add(deptEmp);
deptEmp.setEmployee(this);
return deptEmp;
}
public DeptEmp removeDeptEmp(DeptEmp deptEmp) {
getDeptEmps().remove(deptEmp);
deptEmp.setEmployee(null);
return deptEmp;
}
这是我尝试在交叉表dept\u emp中插入员工和记录的代码:
EntityManagerFactory fact=Persistence.createEntityManagerFactory("EmployeeJPA");
EntityManager man=fact.createEntityManager();
man.getTransaction().begin();
Employee emp=new Employee();
emp.setFirstName(request.getParameter("name"));
emp.setLastName(request.getParameter("surname"));
emp.setEmpNo(Integer.parseInt(request.getParameter("id")));
emp.setBirthDate(Date.valueOf(request.getParameter("birth")));
emp.setBirthDate(Date.valueOf(request.getParameter("hire")));
emp.setGender(request.getParameter("gender"));
HttpSession session=request.getSession();
Department dept=man.find(Department.class, session.getAttribute("idDep"));
man.persist(emp);
man.getTransaction().commit();
DeptEmp depEm=new DeptEmp();
depEm.setEmployee(emp);
depEm.setDepartment(dept);
man.getTransaction().begin();
man.persist(depEm);
man.getTransaction().commit();
man.close();
fact.close();
这就是错误:
GRAVE: Servlet.service() for servlet [servlet.AddEmployeeServlet] in
context with path [/EmployeeJPA] threw exception
javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse
Persistence Services - 2.5.0.v20130507-3faac2b):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'dept_no' cannot be null Error Code: 1048 Call: INSERT INTO dept_emp (from_date, to_date, dept_no, emp_no) VALUES (?, ?, ?, ?)
bind => [null, null, null, null]
我不能理解,因为我有这个错误。我是否以不同的方式插入交叉表?
有人能帮我吗?
谢谢看起来像一条线
Department dept=man.find(Department.class,session.getAttribute(“idDep”));
返回NULL
但是在db表中,dept_no列上没有null约束。不确定这是否是问题的真正原因,但是
Department
是在不同的事务中检索的,而deep
实体是持久的。这通常会导致一些问题,因此可能需要开始将代码排序为以下内容:
HttpSession session = request.getSession();
Object deptId = session.getAttribute("idDep");
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("EmployeeJPA");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Employee emp = new Employee();
// fill employee's fields
entityManager.persist(emp);
Department dept = entityManager.find(Department.class, deptId);
DeptEmp depEm = new DeptEmp();
depEm.setEmployee(emp);
depEm.setDepartment(dept);
entityManager.persist(depEm);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
您需要执行的三个操作应在同一事务的上下文中:
GRAVE: Servlet.service() for servlet [servlet.AddEmployeeServlet] in
context with path [/EmployeeJPA] threw exception
javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse
Persistence Services - 2.5.0.v20130507-3faac2b):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'dept_no' cannot be null Error Code: 1048 Call: INSERT INTO dept_emp (from_date, to_date, dept_no, emp_no) VALUES (?, ?, ?, ?)
bind => [null, null, null, null]
HttpSession session = request.getSession();
Object deptId = session.getAttribute("idDep");
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("EmployeeJPA");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Employee emp = new Employee();
// fill employee's fields
entityManager.persist(emp);
Department dept = entityManager.find(Department.class, deptId);
DeptEmp depEm = new DeptEmp();
depEm.setEmployee(emp);
depEm.setDepartment(dept);
entityManager.persist(depEm);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();