0

私はJPAを初めて使用し、いくつかの基本的な関係を試しています。

私は2つのエンティティを持っています

 @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

何も悪いことはありません。助言がありますか?

Thx all

4

1 に答える 1

2

1つの問題は、すでに永続化されているオブジェクトに対しても、永続化を呼び出すことです。(addEmployee()を介して)manager1を永続化すると、JPAは財務も永続化します。したがって、addDepartment()で再度永続化することはできません。オブジェクトを永続化するための関数を1つだけ保持し、ルートオブジェクトを渡したらこの関数を呼び出すことをお勧めします。

于 2012-12-25T19:40:37.587 に答える