0

我是 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

我看不出有什么不对。有什么建议么?

谢谢大家

4

1 回答 1

2

一个问题是,即使对于已经被持久化的对象,您也会调用 persists。当您持久化 manager1(通过 addEmployee())时,JPA 也将持久化财务。因此,您不能在 addDepartment() 中再次保留它。我建议只保留一个用于持久对象的函数,并在传递根对象后调用此函数。

于 2012-12-25T19:40:37.587 回答