我是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
我没有看到任何错误。有什么建议吗?
全部
答案 0 :(得分:2)
一个问题是即使对于已经持久化的对象,也要调用持久性。当你持有manager1(通过addEmployee())时,JPA也将继续保持财务状况。因此,您无法在addDepartment()中再次保留它。我建议只保留一个用于持久化对象的函数,并在传递根对象后调用此函数。