Java 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

我正在学习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(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();
您需要执行的三个操作应在同一事务的上下文中:

  • 坚持新员工
  • 找到部门
  • 坚持员工与部门的关系
  • 我检查了它,find()返回正确的实体,事实上我无法理解,因为它不起作用
    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();