Ich entwickle eine Java-Webanwendung mit Hibernate und JSF/Primefaces. bekomme manchmal Fehler wieRuhezustand, Sitzung, Lazyloading
1) ein Objekt mit demselben Bezeichner ist bereits Sitzung zugeordnet.
2) Fehler beim Laden der faulen Initialisierung *, keine Sitzung vorhanden oder Sitzung ist bereits geschlossen.
Ich weiß, dass dies auf falsche Codierung in meiner App zurückzuführen ist. Dies ist die Art, wie ich aap mache:
Wenn ein Benutzer eine Seite anfordert (sei es eine Liste von Mitarbeitern). der Benutzer wird die Mitarbeiterlistenseite (empployeeList.xhtml) EmployeeListMBean ist die verwaltete Bean für diese Seite. in der verwalteten Bean im Konstruktor, Aufruf einer Methode populateEmployees(). populateEmployee() verwendet die EmployeeDao-Methode getAllEmployee(), um GetAllemployees zu erhalten.
Mitarbeiter Klasse geht hier:
@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
}
hier ist mein 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;
}
}
Frage 1) hier in den Methoden, die ich die Sitzung am Schließen und dann das Ergebnis wieder zurück zu bewirtschafteten Bohnen. so in der Mitarbeiter-Listing-Seite die Tabelle Liste Name dob dateOfHire. und ich habe eine detailliertere Ansicht. Wenn ich auf diese Schaltfläche klicke, möchte ich alle Projekte des ausgewählten Mitarbeiters anzeigen, die mit den gleichen verwalteten Beans arbeiten, aber es gibt mir einen Fehler (2), es ist nicht möglich, Lazyload auszuführen, keine Sitzung oder Sitzung ist bereits geschlossen. Wenn ich die Sitzung im getemployeeMethod von dao geöffnet halte, kann das zu einem Speicherverlustproblem oder einem anderen Problem führen. ist es so? Ich habe auch versucht, faul und eifrig zu laden. Bitte geben Sie mir eine klare Vorstellung, wann/wie Sie diese Art des Abrufens verwenden. Wie kann ich das lösen? kann ich mich für Filter oder Facelisten entscheiden, um das zu lösen?
Frage 2) Wenn ich versuche, ein Projekt eines Mitarbeiters zu bearbeiten, und aktualisieren mit session.saveorupadte(), merge(), flush(), bekomme einen Fehler wie folgt, "ein Objekt mit der gleichen Kennung ist bereits mit der Sitzung verbunden " Wie kann ich das lösen?
Frage 3) Ich weiß, dass Sessionsfactory ist ressourcenverbrauchend. Daher reicht nur eine einzige Instanz für eine App aus. aber was ist mit Sitzung? für einen einzelnen Benutzer der App, nur eine Sitzung benötigt? Bitte sagen Sie mir eine gute Strategie für die Entwicklung einer solchen App.
Sie alles, was ich denke, Ihre erste Frage die Antwort :)
Dies ist wirklich mehrere Fragen. Sie können eine bessere Antwort erhalten, wenn Sie sich auf ein Problem pro Frage konzentrieren. –