Как избавиться от LazyInitializationException с Калиткой интеграция JPA/Hibernate (с Spring)

я разрабатываю приложение с помощью Калитки в качестве слоя представления, и JPA (В спящем режиме) как ORM., создание UI было забавой (даже с ajax) использование Калитки. Моя проблема возникает из интеграции постоянных объектов на страницах редактирования (страницы только для чтения не являются никакой проблемой с помощью LoadadableDetachableModel).

Я использую фильтр OSIV с пружины для обеспечения открытого заседания для представления. Но, поскольку я сохраняю объекты области (@Entity отобразил классы) на страницах редактирования, я получаю страшную Ленивую загрузку excetion, когда я получаю доступ к свойствам их в ajax обратных вызовах.

я действительно не хочу спускаться по DTO / VO road, поскольку я думаю, что это только чрезмерно увеличило бы размер кода и требует, чтобы я написал много шаблонного кода.

Одна идея состояла в том, чтобы использовать объекты модели в представлении, объединиться, переданные в объекте с током в спящем режиме сессия и доступ все методы get, чтобы полностью инициализировать объект. после этого объект хранился бы в представлении (seesion) и становиться отдельным. На сохранение я повторно объединил бы его и фиксировал бы изменение.

Это было бы рекомендуемым путем? Есть ли лучшие решения? Достаточно странный, большинство книг / блоги / практические руководства полностью игнорируют такую проблему.

Какое управление транзакциями Вы предложили бы? Прямо сейчас я использую @Transaction на уровне служб. Как это изменилось бы, если я использую другие способы получить доступ к тому, чтобы хранить данные через, в спящем режиме сессии?

Любые указатели / Ссылки одобрены, поскольку я отчасти потерян здесь..

заранее спасибо

7
задан Bozho 18 January 2010 в 11:30
поделиться

4 ответа

Этот пост блогов (который входит в детали ЛДМ), дал мне несколько хороших представлений, особенно для сценариев редактирования:

, создание смарт-эквизетмодели

FWIW, у меня были очень хорошие результаты, используя Пользовательские запросы (как предложено в разделе «Отмена комментариев ссылки выше) в Perfbench , и вы можете найти код здесь . IIRC Это упрощение подхода (OpensessiveView / London Wicket) из ссылки Bozho Опубликовано.

6
ответ дан 7 December 2019 в 01:21
поделиться

Это - короткая презентация на opensessiveInview с помощью калитки.

При правильном использовании подход OpenSessionInView должен гарантировать, что нет LazyinitializationException .

3
ответ дан 7 December 2019 в 01:21
поделиться

Определите значение по умолчанию для n перед для оператора :

iterator = (i*i for i in range(100) if i % 3 == 0)

n=None
for n, i in enumerate(iterator):
    do_something(i)

print n
-121--4222837-

Вот два метода, которые вычисляют расстояние Левенштейна между последовательностями.

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

Как только вы получите результат, вам нужно будет определить, какое значение вы хотите использовать в качестве порога для совпадения или No. Запустите функцию для группы образцов данных, чтобы получить хорошее представление о том, как это работает, чтобы помочь решить о вашем конкретном пороге.

    /// <summary>
    /// Calculates the Levenshtein distance between two strings--the number of changes that need to be made for the first string to become the second.
    /// </summary>
    /// <param name="first">The first string, used as a source.</param>
    /// <param name="second">The second string, used as a target.</param>
    /// <returns>The number of changes that need to be made to convert the first string to the second.</returns>
    /// <remarks>
    /// From http://www.merriampark.com/ldcsharp.htm
    /// </remarks>
    public static int LevenshteinDistance(string first, string second)
    {
        if (first == null)
        {
            throw new ArgumentNullException("first");
        }
        if (second == null)
        {
            throw new ArgumentNullException("second");
        }

        int n = first.Length;
        int m = second.Length;
        var d = new int[n + 1, m + 1]; // matrix

        if (n == 0) return m;
        if (m == 0) return n;

        for (int i = 0; i <= n; d[i, 0] = i++)
        {
        }

        for (int j = 0; j <= m; d[0, j] = j++)
        {
        }

        for (int i = 1; i <= n; i++)
        {

            for (int j = 1; j <= m; j++)
            {
                int cost = (second.Substring(j - 1, 1) == first.Substring(i - 1, 1) ? 0 : 1); // cost
                d[i, j] = Math.Min(
                    Math.Min(
                        d[i - 1, j] + 1,
                        d[i, j - 1] + 1),
                    d[i - 1, j - 1] + cost);
            }
        }

        return d[n, m];
    }
-121--979820-

Если вы используете LoadadureDetachureModel, что вы не передаете компонент в качестве модели, то калитка не вызовет на них .detatch (), и часто они также не сериализируются, поэтому у них будут старые данные, и бросит ленивое исключение.

Всегда передавайте LDM компоненту или отсоединяйте их самостоятельно.

0
ответ дан 7 December 2019 в 01:21
поделиться

Наконец-то у меня появилось время снова поработать над этой проблемой. Не знаю, как я мог пропустить простое решение;)

Мы разработали нашу собственную UIFormModel реализацию интерфейса Wickets IModel. Поскольку я хотел сохранить ввод данных пользователем во время HTTP-запросов, я ничего не делал в вызове detach (), сохраняя (и сериализуя) объект модели в полном состоянии.

Все, что мне нужно было добавить , было флагом, который detach () был вызван , и проверить этот флаг в методе getObject () . Если флаг был установлен, я выполняю EntityManager.merge () и получаю повторно подключенную модель, которую я могу использовать в компонентах пользовательского интерфейса.

Спасибо всем за ваш вклад

1
ответ дан 7 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: