Спящий режим — EhCache — в каком регионе кэшировать ассоциации/наборы/коллекции?

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

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

родитель.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>

дети.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 в качестве поставщика кеша 2-го уровня. Я пытался найти ответ на этот вопрос, но не нашел ответа в этом направлении. Более разумно использовать org.demo.children, но я не знаю, в каких сценариях следует использовать отдельную область кеша для ассоциаций/наборов/коллекций, как в приведенном выше случае. Пожалуйста, предоставьте свои комментарии, а также дайте мне знать, если я не уверен в своем вопросе.

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


person user293297    schedule 14.03.2010    source источник


Ответы (1)


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

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

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

person Pascal Thivent    schedule 14.03.2010
comment
Спасибо за ответ. Это имеет смысл IMO, поскольку вы хотите иметь возможность аннулировать конкретную коллекцию или все коллекции в регионе, не аннулируя все объекты из типа коллекции. Вы хотите сказать, что в приведенной выше конфигурации кеша наличие двух разных областей кеша для дочерних элементов выгодно. не понял как?? любезно уточните. Насчет консистенции. Если один регион (org.demo.parent.children) был обновлен, другой регион кеша для детей (org.demo.children) не отразил бы это изменение. Не вызывает ли это несоответствия. Пожалуйста, уточните. - person user293297; 14.03.2010
comment
@lifeisnotfair Я не уверен, что пойму тебя. Во-первых, согласны ли вы с тем, что вы можете изменять коллекцию, добавляя/удаляя элементы, не изменяя сами элементы? Я не вижу здесь никакого источника несоответствия. Во-вторых, Hibernate обрабатывает кеш/регионы за вас, поэтому вам не нужно об этом беспокоиться. И это еще одна причина использовать значения по умолчанию (особенно если вы новичок в Hibernate) вместо того, чтобы пытаться преждевременно (и, возможно, неправильно) оптимизировать то, что не является проблемой. Если вы хотите сделать точную настройку, сделайте это позже. - person Pascal Thivent; 15.03.2010