Только что начал изучать спящий режим и понять спящий кэш второго уровня. Я создал комментарий Entity и попытаюсь работать над ним. Вот мои коды!hibernate понимание уровня 2-го уровня
@Entity
@Table(name = "comment")
@FilterDefs(value={@FilterDef(name="projectFilter",[email protected](name="projectID", type="java.lang.Long")), @FilterDef(name="issueFilter", [email protected](name="issueID", type="java.lang.Long"))})
@Filters(value={@Filter(name = "projectFilter", condition = "project_id = :projectID"),
@Filter(name = "issueFilter", condition = "issue_id = :issueID")})
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="comment")
public class Comment {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, precision = 5, scale = 0)
private long id;
@Column(name = "project_id", nullable = false)
private long projectId;
@Column(name = "issue_id", nullable = false)
private long issueId;
@Column(name = "author_id", nullable = false)
private long auhorId;
@Column(name = "author_name", nullable = false)
private String authorName;
@Column(name = "comment")
private String comment;
@Column(name = "created_date")
private Date createdDate;
Я хочу получить комментарии пользователей на основе проекта или проекта и проблемы. В DAO я написал следующую функцию для комментариев на основе projectid.
@Autowired
private SessionFactory sessionFactory;
...
@Override
public List<Comment> getAllProjectComments(long projectId) {
Session session = getCurrentSession();
Filter filter = session.enableFilter("projectFilter");
filter.setParameter("projectID", projectId);
return session.createQuery("from Comment").setCacheable(true).list();
}
и ehcahe.xml ниже
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false">
<diskStore path="java.io.tmpdir/hibernate-cache"/>
<defaultCache maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="2400"
overflowToDisk="false"
maxElementsOnDisk="1000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="1200"
memoryStoreEvictionPolicy="LRU"/>
<cache name="org.trackMyProject.entity.Comment"
maxElementsInMemory="50"
maxElementsOnDisk="500"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
Я добавил 500 комментариев в таблице 2 projectids.
, когда контроллер вызывает метод DAO для получения комментариев на основе идентификатора проекта и последующего вызова этого идентификатора проекта, кажется, отлично работает с кэшем второго уровня, и БД не попадает. Но если я переключаюсь между 2 идентификаторами проекта, то каждый раз, когда БД попадает, я не хочу.
Может кто-нибудь сказать мне, какую ошибку я сделал или что нужно сделать больше конфигурации.
Спасибо заранее!
EDIT!
классам: hibernate.cfg.xml
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- <prop key="hibernate.cache.use_query_cache">true</prop> -->
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
</bean>
возможный дубликат [Что является кешированием первого и второго уровней в Hibernate?] (http://stackoverflow.com/questions/337072/what-is-first-and-second-level-caching-in-hibernate) – NimChimpsky