Hibernate, Java: ни один сеанс или сеанс не был закрыт - PullRequest
7 голосов
/ 24 января 2012

Я уже видел такого рода проблемы в Stackoverflow, но ничто не могло помочь мне решить мою проблему.

Я новичок в Hibernate и у меня есть проект, который будет сделан на Java и MySQL, и поэтому я использую hibernate.Мне удалось получить доступ к моим данным, изменить их, удалить их, но я блокирую метод, потому что у меня есть одно исключение, которое приходит ... И увидел, что я все еще понимаю, что не все потоки, которые мне удается не удалить эту ошибку:

Вот моя ошибка:

org.hibernate.LazyInitializationException Могила: не удалось лениво инициализировать коллекцию ролей: DAO.User.files, ни один сеанс или сеанс не был закрыт org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: DAO.User.files, ни один сеанс или сеанс не были закрыты в org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) в org.hibernate.collection.AbstractPersistentCollectionIotLotLotConject.LotionConv.AbstractPersistentCollection.java:350) в org.hibernate.collection.AbstractPersistentCollection.initialize (AbstractPersistentCollection.java:343) в org.hibernate.collection.PersistentSet.add (PersistentSet.java:1)89) в DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) в javaapplication5.JavaApplication5.main (JavaApplication5.java:37)

И вот мои классы Java:

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;
    }

Мой код избыточен, я его знаю(это), это была именно попытка избежать проблемы закрытия сессии.

Сессия закрывается в строке:

U.getFiles () .add (f);

И 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();
    }
}

Я поместил отображение session.isOpen () везде в моем коде, а также попытался бороться с ошибкой.Программа, таким образом, продолжается и показывает мне систематически истинное значение, будь то до или после исключения!

Ответы [ 3 ]

12 голосов
/ 24 января 2012

Общая проблема: вы открываете транзакцию, создаете объект Hibernate с помощью FetchType LAZY. Hibernate создает прокси для коллекции, которая будет загружать объекты при первом использовании коллекций. Вы закрываете транзакцию и пытаетесь получить доступ к этой коллекции. Сеанс гибернации истек, так как транзакция закрыта, поэтому вы получили ошибку.

Вам следует изменить дизайн своего кода, чтобы никогда не возвращать объект с унифицированными прокси из блока транзакции. Вам следует либо загрузить коллекции, либо evict объект из сеанса, либо не отображать коллекцию автоматически (удалить их из POJO).

2 голосов
/ 25 июля 2012

Если вы сохраняете свои прокси-объекты hibernate непосредственно в приложении, они будут доступны до начала сеанса.После закрытия сеанса вы не сможете получить доступ к этим объектам.если вы попытаетесь получить к ним доступ после закрытия транзакции, вы получите это

org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException  

Так что всегда лучше сделать новую копию ваших прокси-сущностей, если вы собираетесь использовать их после закрытия транзакции.

0 голосов
/ 08 сентября 2013

Делая следующую строку в web.xml, мы можем исправить исключение LazyInitilization.

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

визит: http://blog.gmorales.net/2012/03/how-to-solve-orghibernatelazyinitializa.html?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...