私は、HibernateとJSF/primefacesを使ってJava Webアプリケーションを開発しています。 Hibernate、session、lazyloading
のようなエラーが発生することがあります。1)同じ識別子を持つオブジェクトが既にセッションに関連付けられています。
2)遅延初期化のロードに失敗しました*、セッションが存在しない、またはセッションがすでに閉じられています。
これは私のアプリで不適切なコーディングが原因であることがわかりました。 これはaapを実行している方法です。
ユーザーがページを要求したとき(従業員のリストにする)。 ユーザーは従業員リストページ(empployeeList.xhtml)を取得します EmployeeListMBeanはこのページの管理対象Beanです。コンストラクタ内のマネージドBean内の は、メソッドpopulateEmployees()を呼び出しています。 populateEmployee()は、EmployeeDaoメソッドgetAllEmployee()を使用してgetAllemployeesを使用します。
Employeeクラスは、ここに行く:メソッドで私がセッションを終了し、その結果をバック返しています、ここ
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) :ここ
@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ですto managedbeans。 従業員のリストページでは、テーブルのリストの名前はdobのdateOfHireです。私はより詳細なボタンビューを持っています。このボタンをクリックすると、同じmanagedbeansを使用して作業している選択した従業員のすべてのプロジェクトを表示したいのですが、エラー(2)、lazyloadに失敗、セッションまたはセッションが閉じられていません。 セッションをdaoのgetemployeeMethodで開いたままにしておくと、メモリリークの問題やその他の問題が発生する可能性があります。そうですか? また、私は怠惰で熱心な読み込みを試みました。これらのタイプのフェッチをいつどのように使うべきか、私に明確なアイデアを与えてください。 どうすればこの問題を解決できますか?私はこれを解決するためのフィルターやfacististersに行くことができますか?
質問2) 従業員のプロジェクトを編集しようとしていて、session.saveorupadte()、merge()、flush()を使用して更新しようとすると、このようなエラーが発生します。既にセッションに関連付けられています " どうすればこの問題を解決できますか?
質問3) 私はsessionfactoryがリソースを消費していることを知っています。 1つのアプリケーションには1つのインスタンスで十分です。セッションについてはどうですか?アプリのシングルユーザーの場合は 、セッションは1回だけ必要ですか? このようなアプリを開発するための良い戦略を教えてください。あなたのすべてに感謝:)
これは実際には複数の質問です。 1つの質問につき1つの問題に集中すれば、より良い回答を得ることができます。 –