Tôi đã thấy loại sự cố này trên Stackoverflow nhưng không có gì có thể giúp tôi giải quyết vấn đề của mình.Hibernate, Java: không có phiên hoặc phiên nào được đóng
Tôi là người mới trong Hibernate và có một dự án được thực hiện trong Java và MySQL, và do đó sử dụng ngủ đông. Tôi quản lý để đạt được dữ liệu của tôi, để sửa đổi chúng, để xóa, nhưng tôi chặn trên một phương pháp vì tôi có một ngoại lệ mà đến .. Và thấy rằng tôi hiểu vẫn không phải tất cả các chủ đề tôi quản lý không để loại bỏ lỗi này:
đây là lỗi của tôi:
org.hibernate.LazyInitializationException Grave: thất bại trong việc uể oải khởi tạo một tập hợp các vai trò: DAO.User.files, không có phiên làm việc hoặc phiên đã được đóng org.hibernate.LazyInitializationException: thất bại để lười biếng khởi tạo một tập hợp vai trò: DAO.User.files, không có phiên hoặc phiên nào bị đóng tại org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) tại org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) tại org.hibernate.collection.AbstractPersistentCollection.initialize (AbstractPersistentCollection .java: 343) tại org.hibernate.collection.PersistentSet.add (PersistentSet.java:189) tại DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) tại javaapplication5.JavaApplication5.main (JavaApplication5.java:37)
Và đây là các lớp Java của tôi:
public static void main(String[] args) {
GroupDAO grDAO = new GroupDAO();
List[] lists = grDAO.removeGroup(grDAO.getGroupById(1));
FileDAO fiDAO = new FileDAO();
fiDAO.removeGroupAddFiles(lists);
UserDAO usDAO = new UserDAO();
usDAO.removeGroupAddUserFiles(lists);
}
GroupDAO.java:
public List[] removeGroup(Group group) {
Set<File> setFiles = group.getFiles();
Set<User> setUsers = group.getUsers_1();
List[] lists = new List[2];
Iterator<File> itFiles = setFiles.iterator();
Iterator<User> itUsers = setUsers.iterator();
List<File> listFiles = new ArrayList<File>();
List<User> listUsers = new ArrayList<User>();
while (itFiles.hasNext()) {
listFiles.add(itFiles.next());
}
while (itUsers.hasNext()) {
listUsers.add(itUsers.next());
}
lists[0] = listUsers;
lists[1] = listFiles;
org.hibernate.Transaction tx = session.beginTransaction();
session.delete(group);
tx.commit();
return lists;
}
FileDAO.java:
public List[] removeGroupAddFiles(List[] lists) {
System.out.println("5 : " + session.isOpen());
System.out.println("6 : " + session.isOpen());
Iterator<File> itFile = lists[1].iterator();
System.out.println("7 : " + session.isOpen());
org.hibernate.Transaction tx = session.beginTransaction();
while (itFile.hasNext()) {
System.out.println("8 : " + session.isOpen());
Iterator<User> itUser = lists[0].iterator();
System.out.println("9 : " + session.isOpen());
File f = itFile.next();
while (itUser.hasNext()) {
System.out.println("10 : " + session.isOpen());
System.out.println("11 : " + session.isOpen());
User u = itUser.next();
System.out.println("12 : " + session.isOpen());
File fCopie = new File(u, f.getName() + "_" + u.getFirstName() + "_" + u.getLastName(), f.getExtension(), f.getSize(), f.getCreatedAt(), f.getUpdateAt());
System.out.println("13 : " + session.isOpen());
session.save(fCopie);
System.out.println("14 : " + session.isOpen());
}
}
tx.commit();
return lists;
}
UserDAO.java:
public List[] removeGroupAddUserFiles(List[] lists) {
System.out.println("15 : " + session.isOpen());
Iterator<User> itUser = lists[0].iterator();
System.out.println("16 : " + session.isOpen());
org.hibernate.Transaction tx = session.beginTransaction();
while (itUser.hasNext()) {
System.out.println("17 : " + session.isOpen());
Iterator<File> itFile = lists[1].iterator();
System.out.println("18 : " + session.isOpen());
User u = itUser.next();
while (itFile.hasNext()) {
System.out.println("19 : " + session.isOpen());
File f = itFile.next();
System.out.println("20 : " + session.isOpen());
try {
u.getFiles().add(f);
} catch (LazyInitializationException e) {
e.printStackTrace();
}
System.out.println("21 : " + session.isOpen());
}
try {
session.update(u);
} catch (ConstraintViolationException e) {
e.printStackTrace();
}
System.out.println("22 : " + session.isOpen());
}
tx.commit();
return lists;
}
Mã của tôi là dư thừa, tôi biết anh ta (nó), nó là exac để tránh vấn đề của phiên đã đóng.
Phiên đóng trong dòng:
U.getFiles() .add (f);
Và HibernateUtil.java:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// load from different directory
SessionFactory sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
return sessionFactory;
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
}
tôi đặt một màn hình của session.isOpen() ở khắp mọi nơi trong mã của tôi cũng như một vật thử với lỗi. Chương trình như vậy tiếp tục, và cho thấy tôi có hệ thống đúng, cho dù đó là trước hoặc sau khi ngoại lệ!
Bạn đã thử xem liệu phương thức 'User u = itUser.next();' trong phương thức removeGroupAddUserFiles có được gắn vào phiên trước khi thực hiện 'u.getFiles(). Add (f);'? – Faton
Không, tôi đã không cố gắng vì tôi không biết làm thế nào để thấy rằng: S ... – algelos