java javax 持久化回滚异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14031858/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
javax persistence rollbackException
提问by Darth Blue Ray
I'm new to JPA and I'm trying some basic relationships.
我是 JPA 的新手,我正在尝试一些基本的关系。
I have two entities
我有两个实体
@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
and
和
@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
When I just try to add some entities like this ;
当我只是尝试添加一些这样的实体时;
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;
}
}
I get a :
我得到一个:
:javax.persistence.RollbackException: Error while committing the transaction
:javax.persistence.RollbackException: 提交事务时出错
at JPA.starter.Starter.main(Starter.java:52) -> first adding line
I don't see anything wrong. Any suggestions?
我看不出有什么不对。有什么建议?
Thx all
谢谢所有
回答by user1888014
One problem is that you call persists even for objects that have already been persisted. When you persist manager1 (via addEmployee ()) JPA will also persist finance. So, you cannot persist it again in the addDepartment(). I would recommend to keep only one function for persisting objects and call this function once passing the root object.
一个问题是,即使对于已经被持久化的对象,你也调用了持久化。当您持久化 manager1(通过 addEmployee())时,JPA 也会持久化财务。因此,您不能在 addDepartment() 中再次保留它。我建议只保留一个用于持久化对象的函数,并在传递根对象后调用此函数。