2010-03-14 1 views
1

Я новичок в спящем режиме. Было бы здорово, если бы кто-то мог прокомментировать следующий запрос, который у меня есть:Hibernate - EhCache - в какой регион входят ассоциации/комплекты кэшей/коллекции?

Скажите, что у меня есть родительский класс, и у каждого родителя есть несколько дочерних элементов. Таким образом, отображение файлов родительского класса будет что-то вроде:

parent.hbm.xml

<hibernate-mapping > 
<class name="org.demo.parent" table="parent" lazy="true"> 
<cache usage="read-write" region="org.demo.parent"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 
<property name="name" column="name" type="string" length="50"/> 

<set name="children" lazy="true"> 
<cache usage="read-write" region="org.demo.parent.children" /> 
<key column="parent_id"/> 
<one-to-many class="org.demo.children"/> 
</set> 

</class> 
</hibernate-mapping> 

children.hbm.xml

<hibernate-mapping > 
<class name="org.demo.children" table="children" lazy="true"> 
<cache usage="read-write" region="org.demo.children"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 

<property name="name" column="name" type="string" length="50"/> 

<many-to-one name="parent_id" column="parent_id" type="integer" length="10" not-null="true"/> 

</class> 
</hibernate-mapping> 

Таким образом, для набора детей, должны мы указываем регион org.demo.parent.children, где он должен кэшировать ассоциацию, или мы должны использовать область кеша org.demo.children, где дети будут кэшироваться.

Я использую EHCache в качестве поставщика кеша второго уровня. Я попытался найти ответ на этот вопрос, но не смог найти ответа в этом направлении. Имеет смысл использовать org.demo.children, но я не знаю, в каких сценариях следует использовать отдельный раздел кэша для ассоциаций/наборов/коллекций, как в приведенном выше случае. Просьба предоставить ваши материалы, также сообщите мне, если я не понимаю в своем вопросе.

Спасибо всем.

ответ

2

Таким образом, для набора детей, мы должны указать область org.demo.parent.children, где он должен кэшировать ассоциацию или мы должны использовать область кэша org.demo.children, где дети будут получать кэшированные ,

По умолчанию опция region устанавливается на имя роли класса или коллекции. Таким образом, для set имя региона по умолчанию будет "org.demo.Parent.children" (т. Е. Отличается от названия региона по умолчанию для Child, который будет "org.demo.Child"). Это имеет смысл ИМО, поскольку вы хотите иметь возможность аннулировать конкретную коллекцию или все коллекции в регионе без аннулирования все объекты из типа коллекции.

Но на самом деле большой вопрос: почему, черт возьми, вы не используете значения по умолчанию? Вы вводите дополнительную работу, обслуживание и потенциальные источники проблем, и я не понимаю их преимуществ. Являясь фанатом соглашений по конфигурации, я использую значение по умолчанию (т. Е. Я не устанавливаю region).

+0

Спасибо за ответ. «Это имеет смысл в отношении ИМО, поскольку вы хотите, чтобы иметь возможность аннулировать конкретную коллекцию или все коллекции в регионе, не делая недействительными все сущности из типа коллекции». Вы хотите сказать, что в приведенной выше конфигурации кеша Для двух сторон предпочтительны два разных региона для кеш-памяти. Я не понял, как ??? любезно продуманный. Как насчет последовательности. Если один из регионов (org.demo.parent.children) обновлен, другая область кэша для детей (org.demo.children) не будет отражать изменения tht. Не вызывает ли это несоответствие Просьба уточнить. – user293297

+0

@lifeisnotfair Я не уверен тебя. Во-первых, согласны ли вы с тем, что вы можете изменять коллекцию, добавляя/удаляя элементы без изменения самих элементов? Здесь я не вижу никакого источника несогласованности.Во-вторых, Hibernate обрабатывает кэш/регионы для вас, поэтому вам не нужно беспокоиться об этом. И это еще одна причина использовать настройки по умолчанию (особенно если вы новичок в Hibernate) вместо того, чтобы пытаться оптимизировать преждевременно (и, возможно, ошибочно) то, что не является проблемой. Если вы хотите настроить мелодию, сделайте это позже. –

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