Grails - исключение несохраненного временного экземпляра - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь обновить приложение Grails с 1.0.3 до 1.3.7 и столкнулся с исключением:

 object references an unsaved transient instance - save the transient instance before flushing:

Я не делаю никаких спасений в коде, который срабатывает. Это в следующем коде

public static Season getCurrentSeason() {
        String yearString = ConfigurationHolder.config.year
        assert yearString != null: "need to configure season"
        int year = Integer.parseInt(yearString)

        Affiliation nfl = Affiliation.nfl;
        return Season.findBySeasonKeyAndLeague(year, nfl)
    }

Звонок на Affiliation.nfl:

public static Affiliation getNfl() {
           if (cacheNFL == null) {
            String key = ConfigurationHolder.config.nfl
            cacheNFL = Affiliation.findByKey(key)
        }
        return cacheNFL;
    }

Если я удалил cacheNFL и каждый раз делал реальную выборку, код работал. Мои вопросы:

  • Почему это работало раньше? Похоже на то как сделать выборку с кэшированным объект, который не является частью текущего Hibernate запрос (который я, возможно, неправильно, если есть проблема) никогда не будет поддержан.
  • Есть ли в любом случае вокруг этой проблемы, кроме сделать выборку в базу данных?
  • Как могу ли я сказать, если я бью базы данных или собирается в спящий режим кеш (я не знаю много о Hibernate). Есть ли выход, который может покажи мне?

1 Ответ

6 голосов
/ 21 июня 2011
  1. Это findBy*, которое вызывает flush() - каждый Criteria сбрасывает любой объект, который потенциально может быть возвращен этим Criteria. Это сделано для того, чтобы Criteria вернул все подходящие объекты. Похоже, эта логика была введена в 1.1.

  2. Попробуйте извлечь объект в Affiliation.withNewSession{ }. Или, лучше, получите его до начала текущей транзакции / в начале транзакции, до того, как flush() объекты ed испачкаются.

  3. Включить протоколирование Grails sql: Как регистрировать sql в Grails 1.3.7

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