美文网首页
2018-03-27

2018-03-27

作者: wa_niu | 来源:发表于2018-08-06 20:40 被阅读0次

转自:http://cxl2012.iteye.com/blog/1944489#comments

配置一目了然

hibernate使用版本是:hibernate-release-4.2.5.Final

需要的jar包:hibernate-release-4.2.5.Final\lib\required下所有jar包

ehcache  jar包:hibernate-release-4.2.5.Final\lib\optional\ehcache下所有包

junit:junit-4.10.jar和mysql-connector-java-5.1.15-bin.jar

注:hibernate 4.2.5版本ehcache缓存不依赖commons-logging-1.1.1.jar,需要的是slf4j-api-1.6.1.jar

项目结构如下

hibernate.cfg.xml

注意:hibernate4和hibernate3配置不一样,hibernate4是

Xml代码

org.hibernate.cache.ehcache.EhCacheRegionFactory

而hibernate3的配置是

Xml代码

org.hibernate.cache.EhCacheProvider

 此处有一个疑问是:hibernate4的官方文档中,已经把class改了,但是属性名称没有改,还是hibernate.cache.provider_class,不是上面的hibernate.cache.region.factory_class,但是写成hibernate.cache.provider_class会报下面错误

Java代码

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]  

at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186)

at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)

at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)

at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:264)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790)

at com.test.pojo.UserTest.beforeClass(UserTest.java:28)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)

at org.junit.runners.ParentRunner.run(ParentRunner.java:300)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factoryclassname to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan,forexample, is available in the classpath).

at org.hibernate.cache.internal.NoCachingRegionFactory.buildTimestampsRegion(NoCachingRegionFactory.java:87)

at org.hibernate.cache.spi.UpdateTimestampsCache.(UpdateTimestampsCache.java:62)

at org.hibernate.internal.CacheImpl.(CacheImpl.java:72)

at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40)

at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35)

at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:91)

at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:176)

...20more

 说是hibernate.cache.region.factory_class属性没有配置,估计官方文档里没有把属性改过来。。。

ehcache.xml

Xml代码

xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"

updateCheck="false">

        name:cache唯一标识   

        eternal:缓存是否永久有效   

        maxElementsInMemory:内存中最大缓存对象数  

        overflowToDisk(true,false):缓存对象达到最大数后,将缓存写到硬盘中  

        diskPersistent:硬盘持久化  

        timeToIdleSeconds:缓存清除时间   

        timeToLiveSeconds:缓存存活时间  

        memoryStoreEvictionPolicy:缓存清空策略  

        1.FIFO:first in first out 先讲先出  

        2.LFU: Less Frequently Used 一直以来最少被使用的  

        3.LRU:Least Recently Used  最近最少使用的  

-->

timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/>

overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="3600"

timeToLiveSeconds="3600"memoryStoreEvictionPolicy="LFU"/>

User实体类

Java代码

packagecom.test.pojo;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importorg.hibernate.annotations.Cache;

importorg.hibernate.annotations.CacheConcurrencyStrategy;

@Entity

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

publicclassUser {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

privateintid;

privateString name;

privateintage;

publicintgetId() {

returnid;

    }  

publicvoidsetId(intid) {

this.id = id;

    }  

publicString getName() {

returnname;

    }  

publicvoidsetName(String name) {

this.name = name;

    }  

publicintgetAge() {

returnage;

    }  

publicvoidsetAge(intage) {

this.age = age;

    }  

}  

UserTest测试类:

Java代码

packagecom.test.pojo;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.Configuration;

importorg.hibernate.service.ServiceRegistry;

importorg.hibernate.service.ServiceRegistryBuilder;

importorg.junit.BeforeClass;

importorg.junit.Test;

publicclassUserTest {

privatestaticSessionFactory sessionFactory =null;

@BeforeClass

publicstaticvoidbeforeClass() {

Configuration configuration =newConfiguration();

try{

            configuration.configure();  

}catch(HibernateException e) {

// TODO Auto-generated catch block

            e.printStackTrace();  

        }  

ServiceRegistry serviceRegistry =newServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

        sessionFactory = configuration.buildSessionFactory(serviceRegistry);  

    }   

@Test

publicvoidtestEhcache() {

        Session session = sessionFactory.openSession();  

        session.beginTransaction();  

User u1 = (User) session.load(User.class,3);

        System.out.println(u1.getName());  

        session.getTransaction().commit();  

        session.close();  

        Session session2 = sessionFactory.openSession();  

        session2.beginTransaction();  

User u2 = (User) session2.load(User.class,3);

        System.out.println(u2.getName());  

        session2.getTransaction().commit();  

        session2.close();  

    }  

}  

 结果:

Java代码

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from User user0_ where user0_.id=?  

zhangsan  

zhangsan  

list二级缓存测试

Java代码

packagecom.test.pojo;

importjava.util.List;

importorg.hibernate.HibernateException;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.Configuration;

importorg.hibernate.service.ServiceRegistry;

importorg.hibernate.service.ServiceRegistryBuilder;

importorg.junit.BeforeClass;

importorg.junit.Test;

publicclassUserTest {

privatestaticSessionFactory sessionFactory =null;

@BeforeClass

publicstaticvoidbeforeClass() {

Configuration configuration =newConfiguration();

try{

            configuration.configure();  

}catch(HibernateException e) {

// TODO Auto-generated catch block

            e.printStackTrace();  

        }  

ServiceRegistry serviceRegistry =newServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

        sessionFactory = configuration.buildSessionFactory(serviceRegistry);  

    }   

@SuppressWarnings("unchecked")

@Test

publicvoidtestListEhcache() {

        Session session = sessionFactory.openSession();  

        session.beginTransaction();  

List users1 = (List)session.createQuery("from User").setCacheable(true).list();

for(User user : users1) {

            System.out.println(user.getName());  

        }  

        session.getTransaction().commit();  

        session.close();  

        Session session2 = sessionFactory.openSession();  

        session2.beginTransaction();  

List users2 = (List)session2.createQuery("from User").setCacheable(true).list();

for(User user : users2) {

            System.out.println(user.getName());  

        }  

        session2.getTransaction().commit();  

        session2.close();  

    }  

}  

 输出结果:

Java代码

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from User user0_  

zhangsan  

zhangsan  

lisi  

wangwu  

zhangsan  

zhangsan  

lisi  

wangwu  

相关文章

网友评论

      本文标题:2018-03-27

      本文链接:https://www.haomeiwen.com/subject/ptrscftx.html