javax持久性rollbackException

时间:2012-12-25 15:20:36

标签: java jpa

我是JPA的新手,我正在尝试一些基本的关系。

我有两个实体

 @Entity
@Table(name = "relationshipDepartment")
public class Department implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue()
    private Long id;
    @Version
    @Column(name = "OPTLOCK")
    private long version;
    private String name;
    private String code;
    @OneToOne
    private Employee manager;

    public Department() {
        super();
    }

     getters and setters

    @Entity
@Table(name = "relationshipEmployee")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue()
    private Long id;
    @Version
    @Column(name = "OPTLOCK")
    private long version;
    private String name;
    private String title;
    private double salary;
    @ManyToOne
    private Employee supervisor;
    // A employee is a member of one department
    @ManyToOne
    private Department department;

    public long getVersion() {
        return version;
    }
    getters and setters

当我尝试添加这样的实体时;

   public class Starter {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Employee ceo  = new Employee ();
        Employee manager1 = new Employee ();
        Employee manager2 = new Employee ();

        ceo.setName("Bill Clinton");
        ceo.setTitle("CEO");
        ceo.setSalary(3800.0);
        ceo.setSupervisor(ceo);

        manager1.setName("Hilary Clinton");
        manager1.setTitle("Manager");
        manager1.setSalary(3200.0);
        manager1.setSupervisor(ceo);

        manager2.setName("Tim Reyback");
        manager2.setTitle("Manager");
        manager2.setSalary(3200.0);
        manager2.setSupervisor(ceo);

        Department finance = new Department ();
        Department research = new Department ();

        finance.setCode("FIN");
        finance.setName("Finance");

        research.setCode("RES");
        research.setName("Research");

        ceo.setDepartment(finance);
        manager1.setDepartment(finance);
        manager2.setDepartment(research);

        finance.setManager(manager1);
        research.setManager(manager2);

        addEmployee(manager1);
        addEmployee(manager2);

        addDepartement(finance);
        addDepartement(research);

        System.out.println("All the employees");

        List<Employee> employees = retrieveEmployees();
        for (Employee aEmployee : employees) {
            System.out.println(aEmployee.toString());
        }       

        System.out.println("All the departments");

        List<Department> departments = retrieveDepartments();
        for (Department aDepartment : departments) {
            System.out.println(aDepartment.toString());
        }   
    }


    private static void addEmployee(Employee employee) {
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("JPAex4");
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(employee);
            em.getTransaction().commit();
        } catch (Exception e) {
            logging.error("erorr at adding a employee"
                    + " :" + e);
        } finally {
            // Close all the connections:
            em.close();
            emf.close();
        }
    }


    private static List<Employee> retrieveEmployees() {
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("JPAex4");
        EntityManager em = emf.createEntityManager();
        List<Employee> results = null;
        try {
            // Retrieve all the Employee objects from the database:
            TypedQuery<Employee> query = em.createQuery(
                    "SELECT e FROM Employee e", Employee.class);
            // Creation of the Userlist
            results = query.getResultList();
            return results;
        } catch (Exception e) {
            logging.error("error at the employeelist"
                    + " :" + e);
        } finally {
            // Close all the connections:
            em.close();
            emf.close();
        }
        return results;
    }

    private static void addDepartement(Department department) {
            EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("JPAex4");
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(department);
            em.getTransaction().commit();
        } catch (Exception e) {
            logging.error("error department"
                    + " :" + e);
        } finally {
            // Close all the connections:
            em.close();
            emf.close();
        }
    }


    private static List<Department> retrieveDepartments() {

        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("JPAex4");
        EntityManager em = emf.createEntityManager();
        List<Department> results = null;
        try {
            // Retrieve all the Employee objects from the database:
            TypedQuery<Department> query = em.createQuery(
                    "SELECT e FROM Department e", Department.class);
            // Creation of the Userlist
            results = query.getResultList();
            return results;
        } catch (Exception e) {
            logging.error("Error departementlist"
                    + " :" + e);
        } finally {
            // Close all the connections:
            em.close();
            emf.close();
        }
        return results;
    }

}

我得到了:

:javax.persistence.RollbackException:提交事务时出错

at JPA.starter.Starter.main(Starter.java:52) -> first adding line

我没有看到任何错误。有什么建议吗?

全部

1 个答案:

答案 0 :(得分:2)

一个问题是即使对于已经持久化的对象,也要调用持久性。当你持有manager1(通过addEmployee())时,JPA也将继续保持财务状况。因此,您无法在addDepartment()中再次保留它。我建议只保留一个用于持久化对象的函数,并在传递根对象后调用此函数。