2009-11-23 5 views
0

Итак, я действительно цепляюсь за соломинку за идеи здесь. (Также обратите внимание: это прерывистый проблема)hibernate ehcache только нахождение 1 элемента коллекции

я есть «родительский» объект с коллекцией предметов «ребенка»:

< Родитель вещи>
...
< набор имя =» дети "обратная = "истина" порядка по = "child_id">
< использование кэша = "чтение-запись"/>
< ключевой столбец = "parent_id"/>
< один-ко-многим класса =" ChildClass "/>
</комплект>
...
</родитель>

< ребенка вещи>
...
< многие-к-одному имени = "родительским"
колонка = "parent_id"
вставка = "истина"
обновление = "истинный"
не-нуль = "истинный"
класс = "ParentClass"
индекс = "idx_child_parent" /> ...
</ребенок>

если я выполнить запрос, который, как: "выбрать детей из ChildClass ребенка" + «, где child.parent =: родитель «; он находит всех детей. идеально.

Однако, если я ищу родительский объект (и найду его), спящий режим проходит и создает мой ParentClass, но только заполняет ONE (первый) дочерний элемент. я фактически отлаживался в спящий код и обнаружил, что infact вызов setChildren() в ParentClass был отправлен только 1 коллекцией элементов - когда я знаю, что из первого запроса больше.

так что я использую EHCache, и очистка его не очень хорошо: вызов CacheManager.getInstance(). ClearAll();

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

Существует не что-нибудь (что я знаю), что происходит непосредственно, чтобы вызвать это. кто-нибудь знает ошибку в спящем режиме, которая может вызвать это, или ошибку EHCache. я правильно звоню в свой кеш?

любые указатели были бы хорошими.

Я использую hibernate 3.2.6, и та же проблема возникает и в mysql и postgres.

edit: Я также должен добавить, что эта коллекция только с одним элементом находится в состоянии «никогда не существовало». то есть. никогда не было транзакций, в результате которых только один дочерний элемент

ответ

1

Оказалось, что в какой-то момент мы делаем «join fetch» ​​при получении обзора. Извлечение соединения означает, что для коллекции детей возвращаются только те дети, которые соответствуют моему предложению where. Итак, скажите, что у меня 3 ребенка> 10 и 1 ребенок < 10, если в моем заявлении указано, что ребенок < 10, он возвращает родительский объект с набором детей, содержащим ТОЛЬКО одного ребенка. Thats штраф, thats, что «присоединиться за выбор» для.

Неправильно то, что Ehcache не знает, что этот родительский объект «неполный», и поэтому он сохраняет это неполное значение в кеше. В следующий раз, когда я хочу «полный» родительский объект, я не получу его, я получу неполный, и Hibernate не говорит мне (не знает) в противном случае.

Редактировать: note: это было случайно, что каждый раз, когда это случалось, это был только один дочерний элемент. возможно, там будет больше.

2

Имеет ли ваш ребенок класс implement hashcode() and equals() correctly?Возможно ли, что Hibernate видит несколько классов Child, которые привязаны к одному и тому же Родителю как эквивалентные и, таким образом, только сохраняют одно из них?

+0

Извините за скучный комментарий, но 'hashCode()' :) – Bozho

+0

, если они были неправильными, он (предположительно) последовательно возвращал неправильных детей. Однако я все равно проверял, и они верны. спасибо за идею – gcrain

Смежные вопросы