我正在开发使用Hibernate和JSF / primefaces Java Web应用程序。 我有时会收到类似的错误
1)具有相同标识符的对象已经与会话相关联。
2)未能加载延迟初始化*,无会话中或会话已经关闭。
我知道这是因为我的应用程序不正确的编码。 这是我做AAP方式:
当用户对页面请求(让它成为员工的列表)。 用户将得到员工列表页面(empployeeList.xhtml)EmployeeListMBean是这个页面的托管Bean。 在构造函数中的托管bean,我调用一个方法populateEmployees()。 populateEmployee()将使用EmployeeDao方法getAllEmployee()来getAllemployees。
Employee类放在这里:
@Entity
@Table(name = "Employee")
@NamedQueries({
@NamedQuery(name = "Employee.getAllEmployee", query = "from Employee"),
@NamedQuery(name = "Employee.findEmployeeByFirstName", query = "from Employee where firstName = :firstName"),
@NamedQuery(name = "Employee.findEmployeeByLastName", query = "from Employee where lastName = :lastName"),
@NamedQuery(name = "Employee.findEmployeeByMiddleName", query = "from Employee where middleName = :middleName"),
@NamedQuery(name = "Employee.findEmployeeByOffice", query = "from Employee where office.id = :officeId")
})
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EID")
private long id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "GENDER")
private String gender;
@Column(name = "DOB")
@Temporal(javax.persistence.TemporalType.DATE)
private Date dateOfBirth;
@Column(name = "DOH")
@Temporal(javax.persistence.TemporalType.DATE)
private Date dateOfHire;
@ManyToOne(cascade= CascadeType.ALL)
private Office office;
@OneToOne(cascade = CascadeType.ALL)
private ResidenceAddress residence;
@OneToMany
private List<Project> projects;
//getters and setters
}
这里是我的EmployeeDao:
public class EmployeeDao implements Serializable{
private SessionFactory factory;
private Session session;
public void addEmployee(Employee employee){
factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
session.beginTransaction();
session.save(employee);
session.getTransaction.commit();
}
public List<Employee> getAllEmployee(){
factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
session.beginTransaction();
List<Employee> cities = session.getNamedQuery("Employee.getAllEmployee").list();
session.close();
return cities;
}
public Employee getEmployeeByEmployeeId(long employeeId){
factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
session.beginTransaction();
Employee employee = (Employee) session.get(Employee.class, employeeId);
session.close();
return employee;
}
}
问题1)这里,在这些方法中,我在会议结束,然后将结果返回到managedbeans。 所以在员工列表页面中的表给出了名DOB dateOfHire。 我有一个buutton查看更多详细信息。 在点击此按钮,我想显示选定员工使用相同managedbeans工作的所有项目,但它给我的错误(2),未能lazyload,没有会话或会话已经关闭。 如果我继续在DAO的getemployeeMethod宣布会议开幕,我想这可能会导致内存泄漏问题,或某些其它问题。 是这样吗? 同时,我试图偷懒,渴望加载。 请给我一个明确的想法时/如何使用这些类型的装载。 我该如何解决这个问题? 我可以去过滤器或facelisteners解决这个?
问题2)如果我试图编辑雇员的项目,以及使用更新session.saveorupadte(),合并(),同花顺(),我得到这样的错误“与相同标识符的对象已与会话相关联”我该如何解决这个问题?
问题3)我知道这个SessionFactory是比较消耗资源。 因此,只有单一实例是足以让一个应用程序。 但是关于会议什么? 对于应用程序的单一用户,只需要一个会话? 请告诉我要开发这样的应用程序很好的策略。
感谢大家:)