Hibernate延迟加载,hibernate底工学习

By admin in 4858.com on 2019年11月5日

public static void main(String[] args) {
 
  DeptEntity dept = getDept(“402882e762ae888d0162ae888e420000”);

转载:

延期加载在Hibernate中是暗中认可延迟加载;

转载自:

  //dept.getEmp()获得子表的记录集结
  System.out.println(dept.getEmp());

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

测量试验代码风华正茂:

 

}

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

HibernateTest.java

 

private static DeptEntity getDept(String did){
  Session session = sessionFactory.openSession();
  DeptEntity dept = (DeptEntity)session.get(DeptEntity.class, did);
  session.close();
  return dept;
}

ehcache 
jar包:hibernate-release-4.3.4.Final\lib\optional\ehcache下全数包

代码:

一:下载hibernate:而且张开解压,里面有个lib文件夹,里面全部都以Hibernate所信赖的jar包,当然,必须要够的骨干包hibernate3.jar(这里本人使用的是hibernate3),至于和当今的hibernate4有吗区别,自个儿也不掌握(希望有大牌能给自家指正卡塔尔;
二:jar包都准备好后,就足以新建多个Java project,将刚刚的的jar包全部导入(当然恐怕不是兼具jar包都亟待,不过本屌也不知道怎可以不要,为了避防万生机勃勃,都进展导入,安全起见嘛卡塔尔国;
三:工程建好后,大家就足以来开展大家的支付演练咯:
率先,大家先在src目录下新建三个hibernate.cfg.xml文件(至于何以在src目录下,因为src目录最终会编写翻译到二个bin文件夹中也便是类路线下(classpath下边卡塔 尔(英语:State of Qatar),服务器运营时会友善在classpath下搜寻该公文进行解析加载进来卡塔尔;
说不上,就开首举行对hibernate.cfg.xml文件配置实行批注(笔者老是的是MySQL5Hibernate延迟加载,hibernate底工学习。数据库,这里不可不将MySQL-connector-Java.jar驱动包导入卡塔尔国:

 

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

/**
 *
 */
package com.b510.examples;

 

运作结果:

注:hibernate
4.2.5版本ehcache缓存不正视commons-logging-1.1.1.jar,要求的是slf4j-api-1.6.1.jar

import java.util.Set;

[html] view
plain copy

Exception in thread “main” org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role:
com.javakc.hibernate.onetomany.entity.DeptEntity.emp, could not
initialize proxy – no Session
at
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
at
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at
org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
at
org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
at
org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:326)
at java.lang.String.valueOf(String.java:2827)
at java.io.PrintStream.println(PrintStream.java:771)
at
com.javakc.hibernate.onetomany.action.TestAction.main(TestAction.java:74)

品类组织如下
 
4858.com 1
 

import org.hibernate.Session;

 

 

hibernate.cfg.xml

/**
 *
 * @author XHW
 *
 * @date 2011-7-18
 *
 */
public class HibernateTest {
 public static void main(String[] args) {
  new HibernateTest().update();
 }
 public void update(){
  Session
session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  Category
category=(Category)session.get(Category.class, 1);
4858.com ,  System.out.println(“id:”+category.getId()+” 
,name:”+category.getName()+”,
description:”+category.getDescription());
  
  Set<Product>
products=category.getProducts();
  
  session.getTransaction().commit();  
 }
 
 
}

 4858.com 24858.com 3

相会延迟加载开头化失败,不能够最早化二个代理。正是会面在非后生可畏对风姿浪漫对象关系中,为了节约能源是暗中认可延迟加载,而get方法又是非延迟加载,所以在进行完二回数据库查询后就实行session.close();关闭了session,而集结是延迟加载,在应用集应时再加载,那个时候session已经关闭,所以得不到代办。解决方法:能够在主表的hbm配置文件中,在<set>标签里安装lazy=”false”,集合就不延迟加载了,因而在实践get方法时,群集也获取到了,就不会身不由己延迟加载难题了。

  1. <?xml version=’1.0′ encoding=’utf-8′?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.         “-//Hibernate/Hibernate Configuration DTD 3.0//EN”  
  4.         “;  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <!– Database connection settings –>  
  8.         <property name=”connection.driver_class”>com.mysql.jdbc.Driver</property>  
  9.         <property name=”connection.url”>jdbc:mysql://127.0.0.1:3306/hibernate4</property>  
  10.         <property name=”connection.username”>root</property>  
  11.         <property name=”connection.password”>root</property>  
  12.         <!– JDBC connection pool (use the built-in) –>  
  13.         <property name=”connection.pool_size”>1</property>  
  14.         <!– SQL dialect –>  
  15.         <property name=”dialect”>org.hibernate.dialect.MySQL5Dialect</property>  
  16.         <!– Enable Hibernate’s automatic session context management –>  
  17.         <property name=”current_session_context_class”>thread</property>  
  18.         <!– Disable the second-level cache –>  
  19.         <!–<property name=”cache.provider_class”>org.hibernate.cache.internal.NoCacheProvider</property> 
  20.         –>  
  21.         <!– 配置二级缓存 –>  
  22.         <property name=”hibernate.cache.use_second_level_cache”>true</property>  
  23.         <property name=”hibernate.cache.region.factory_class”>org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  
  24.         <!– hibernate3的二级缓存配置 –>  
  25.         <!– <property name=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</property> –>  
  26.         <!– 开启查询缓存 –>  
  27.         <property name=”hibernate.cache.use_query_cache”>true</property>  
  28.           
  29.         <!– Echo all executed SQL to stdout –>  
  30.         <property name=”show_sql”>true</property>  
  31.         <!– Drop and re-create the database schema on startup –>  
  32.         <property name=”hbm2ddl.auto”>update</property>  
  33.         <mapping class=”com.test.pojo.User” />  
  34.     </session-factory>  
  35. </hibernate-configuration>  

运营结果:

  1. <span style=”font-size:14px;”><hibernate-configuration>  
  2. <session-factory>  
  3. <property name=”hibernate.connection.driver_class”>com.mysql.jdbc.Driver</property><!– mysql驱动 –>  
  4. <property name=”hibernate.connection.url”>jdbc:mysql:///test</property><!– mysql暗中认可连接数据库test甚至暗中同意端口3306 –>  
  5. <property name=”hibernate.connection.username”>root</property><!– 用户名 –>  
  6. <property name=”hibernate.connection.password”>root</property><!– 密码 –>  
  7. <property name=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property><!– mysql方言 –>  
  8. <property name=”hbm2ddl.auto”>create</property><!– 更新数据库形式 –>  
  9. <property name=”show_sql”>true</property><!– 是或不是后台打字与印刷语句 –>  
  10. <mapping resource=”toone/com/cn/bo/User.hbm.xml”/><!–映射文件–>  
  11. </session-factory>  
  12. </hibernate-configuration></span>  

 

log4j:WARN No appenders could be found for logger
(org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
    select
        category0_.id as id1_0_,
        category0_.name as name1_0_,
        category0_.description as descript3_1_0_
    from
        users.category category0_
    where
        category0_.id=?
id:1  ,name:java,
description:java好啊

 

小心:hibernate4和hibernate3配置不等同,hibernate4是

此地大家看看我们关注的是id,name和description属性,

以上属性(property卡塔尔国我们都得以在以前下载的Hibernate解压包中的etc文件夹下的hibernate.properties文件中找到(卡塔尔国。这里对hbm2ddl.auto进行验证一下(有八个值卡塔尔:

  1. <property name=”hibernate.cache.region.factory_class”>org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  

即便如此有:  Set<Product>
products=category.getProducts();
代码,即:不管理集结对象。不过大家只要的是:

create:每一趟加载hibernate时都会删除上二遍的更换的表,然后依据你的model类再重新来生成新表,哪怕一回未有别的变动也要如此进行,那正是招致数据库表数据错过的多个要害原因。
create-drop
:每便加载hibernate时依据model类生成表,不过sessionFactory风流罗曼蒂克休息,表就机关删除。
update:最常用的天性,第二次加载hibernate时按照model类会自动建设构造起表的组织(前提是先创设好数据库卡塔尔,今后加载hibernate时依照model类自动更新表结构,尽管表结构校订了但表中的行照旧存在不会删除早先的行。要专心的是当布置到服务器后,表结构是不会被立刻创设起来的,是要等利用第四回运转起来后才会。
validate::运维时验证现成schema与您安插的hibernate是不是豆蔻梢头律,要是不均等就抛出十二分,并不做创新。

 

  System.out.println(“id:”+category.getId()+” 
,name:”+category.getName()+”,
description:”+category.getDescription());
出口的是id,name和description属性值,其余的大家无论,所以Hibernate用了lazy
loading(延迟加载),带给的利润正是大家不珍重的

四:接下去大家就足以来拓宽我们的实体开辟了:

而hibernate3的配备是

多少,不用以往加载,当大家要用的时候,才去加载

User.java

  1. <property name=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</property>  

测验代码二:

[java] view
plain copy

 此处有叁个疑难是:hibernate4的法定文书档案中,已经把class改了,但是属性名称没有改,依旧hibernate.cache.provider_class,不是上面包车型客车hibernate.cache.region.factory_class,不过写成hibernate.cache.provider_class会
报上边错误

HibernateTest.java

 

 

代码:

 4858.com 44858.com 5

Java代码 

/**
 *
 */
package com.b510.examples;

  1. <span style=”font-size:14px;”>package toone.com.cn.bo;  
  2. import java.util.Date;  
  3. public class User {  
  4.     private int id;//必得有主键,因为hibernate非常多措施都亟需用到主键id  
  5.     private String name;  
  6.     private Date birthday;//必得提供暗中同意的构造方法,这里未有,可是全数类都带有暗中同意的构造方法;</span>  
  1. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]  
  2.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186)  
  3.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)  
  4.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)  
  5.     at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:264)  
  6.     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790)  
  7.     at com.test.pojo.UserTest.beforeClass(UserTest.java:28)  
  8.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  9.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  10.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  11.     at java.lang.reflect.Method.invoke(Method.java:597)  
  12.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  
  13.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
  14.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  
  15.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)  
  16.     at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  
  17.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)  
  18.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  19.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  20.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  21.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  22.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
  23. 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 factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan, for example, is available in the classpath).  
  24.     at org.hibernate.cache.internal.NoCachingRegionFactory.buildTimestampsRegion(NoCachingRegionFactory.java:87)  
  25.     at org.hibernate.cache.spi.UpdateTimestampsCache.<init>(UpdateTimestampsCache.java:62)  
  26.     at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:72)  
  27.     at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40)  
  28.     at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35)  
  29.     at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:91)  
  30.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:176)  
  31.     … 20 more  

import java.util.Set;

[java] view
plain copy

 说是hibernate.cache.region.factory_class属性没有配备,估算官方文书档案里从未把品质改良来。。。

import org.hibernate.Session;

 

 

/**
 *
 * @author XHW
 *
 * @date 2011-7-18
 *
 */
public class HibernateTest {
 public static void main(String[] args) {
  new HibernateTest().update();
 }
 public void update(){
  Session
session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  Category category=(Category)session.get(Category.class, 1);
  System.out.println(“id:”+category.getId()+” 
,name:”+category.getName()+”,
description:”+category.getDescription());
  
  Set<Product> products=category.getProducts();
  for(Product product:products){
   System.out.println(“ID:  “+product.getId()+” 
name:”+product.getName()+” price: “+product.getPrice());
  }  
  session.getTransaction().commit();  
 }
 
 
}

 4858.com 64858.com 7

ehcache.xml

运营效果:

  1. <span style=”font-size:14px;”>  public int getId() {  
  2.         return id;  
  3.     }  
  4.     public void setId(int id) {  
  5.         this.id = id;  
  6.     }  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public Date getBirthday() {  
  14.         return birthday;  
  15.     }  
  16.     public void setBirthday(Date birthday) {  
  17.         this.birthday = birthday;  
  18.     }  
  19. }</span><span style=”font-size: 24px;”>  
  20. </span>  
  1. <?xml version=”1.0″ encoding=”UTF-8″?>  
  2. <ehcache xmlns:xsi=””  
  3.     xsi:noNamespaceSchemaLocation=””  
  4.     updateCheck=”false”>  
  5.     <!–  
  6.         name:cache唯黄金年代标志   
  7.         eternal:缓存是或不是长久有效   
  8.         maxElementsInMemory:内部存款和储蓄器中最大缓存对象数  
  9.         overflowToDisk(true,false):缓存对象到达最大数后,将缓存写到硬盘中  
  10.         diskPersistent:硬盘悠久化  
  11.         timeToIdleSeconds:缓存息灭时间   
  12.         timeToLiveSeconds:缓存存活时间  
  13.         memoryStoreEvictionPolicy:缓存清空攻略  
  14.         1.FIFO:first in first out 先讲先出  
  15.         2.LFU: Less Frequently Used 一如既往最少被采用的  
  16.         3.LRU:Least Recently Used  这段时间起码使用的  
  17.     –>  
  18.     <defaultCache maxElementsInMemory=”1000″ eternal=”false”  
  19.         timeToIdleSeconds=”120″ timeToLiveSeconds=”120″ overflowToDisk=”true” />  
  20.     <cache name=”userCache” eternal=”false” maxElementsInMemory=”1000″  
  21.         overflowToDisk=”false” diskPersistent=”false” timeToIdleSeconds=”3600″  
  22.         timeToLiveSeconds=”3600″ memoryStoreEvictionPolicy=”LFU” />  
  23. </ehcache>  

log4j:WARN No appenders could be found for logger
(org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
    select
        category0_.id as id1_0_,
        category0_.name as name1_0_,
        category0_.description as descript3_1_0_
    from
        users.category category0_
    where
        category0_.id=?
id:1  ,name:java, description:java好啊
Hibernate: 
    select
        products0_.category_id as
category2_1_,
        products0_.id as id1_,
        products0_.id as
id0_0_,
        products0_.category_id as
category2_0_0_,
        products0_.name as
name0_0_,
        products0_.price as
price0_0_,
        products0_.descripton as
descripton0_0_
    from
        users.product products0_

User.hbm.xml(映射文件卡塔 尔(阿拉伯语:قطر‎

 

    where
       
products0_.category_id=?
ID:  1  name:java SE应用程序设计 price: 78.00
此间能够一览驾驭的告诉我们,当大家要加载Set集结的时候,那时才去加载,而地点的例证,表明的是我们不加载的时候

 

User实体类

Hibernate就滞缓加载

[html] view
plain copy

  1. package com.test.pojo;  
  2.   
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.GenerationType;  
  6. import javax.persistence.Id;  
  7.   
  8. import org.hibernate.annotations.Cache;  
  9. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  10.   
  11. @Entity  
  12. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)  
  13. public class User {  
  14.     @Id  
  15.     @GeneratedValue(strategy=GenerationType.IDENTITY)  
  16.     private int id;  
  17.     private String name;  
  18.     private int age;  
  19.     public int getId() {  
  20.         return id;  
  21.     }  
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.     public void setAge(int age) {  
  35.         this.age = age;  
  36.     }  
  37.       
  38. }  

撤消延迟加载:

 

 

Category.hbm.xml

 4858.com 84858.com 9

UserTest测试类:

代码:

  1. <span style=”font-size:14px;”><hibernate-mapping package=”toone.com.cn.bo.domain”>  
  2.     <class name=”User” table=”user”><!–这里的table值对应数据库中的表名;若无table值,暗许等于类名小写 –>  
  3.         <id name=”id” column=”id”>  
  4.             <generator class=”native”></generator><!–选拔主键自拉长措施–>  
  5.         </id>  
  6.         <property name=”name” column=”name”/><!– 这里的column值对应数据库中的属性名;若无column值,暗中认可等于属性名 –>  
  7.         <property name=”birthday” column=”birthday”/>  
  8.     </class>  
  9. </hibernate-mapping></span>  
  1. package com.test.pojo;  
  2. import org.hibernate.HibernateException;  
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.Configuration;  
  6. import org.hibernate.service.ServiceRegistry;  
  7. import org.hibernate.service.ServiceRegistryBuilder;  
  8. import org.junit.BeforeClass;  
  9. import org.junit.Test;  
  10.   
  11. public class UserTest {  
  12.       
  13.     private static SessionFactory sessionFactory = null;  
  14.     @BeforeClass  
  15.     public static void beforeClass() {  
  16.         Configuration configuration = new Configuration();  
  17.           
  18.   
  19.         try {  
  20.             configuration.configure();  
  21.         } catch (HibernateException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.               
  26.           
  27.         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  28.         sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
  29.     }   
  30.     @Test  
  31.     public void testEhcache() {  
  32.         Session session = sessionFactory.openSession();  
  33.         session.beginTransaction();  
  34.         User u1 = (User) session.load(User.class, 3);  
  35.         System.out.println(u1.getName());  
  36.         session.getTransaction().commit();  
  37.         session.close();  
  38.         Session session2 = sessionFactory.openSession();  
  39.           
  40.         session2.beginTransaction();  
  41.         User u2 = (User) session2.load(User.class, 3);  
  42.         System.out.println(u2.getName());  
  43.         session2.getTransaction().commit();  
  44.         session2.close();  
  45.     }  
  46. }  

<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping
DTD 3.0//EN”
“”>
<!–
    Mapping file autogenerated by MyEclipse Persistence Tools
–>
<hibernate-mapping>
    <class name=”com.b510.examples.Category” table=”category”
catalog=”users”>
        <id name=”id” type=”java.lang.Integer”>
            <column name=”id” />
            <generator class=”increment” />
        </id>
        <property name=”name” type=”java.lang.String”>
            <column name=”name” length=”500″ />
        </property>
        <property name=”description” type=”java.lang.String”>
            <column name=”description” length=”500″ />
        </property>
        <set name=”products” inverse=”true” lazy=”false”>
            <key>
                <column name=”category_id” />
            </key>
            <one-to-many class=”com.b510.examples.Product” />
        </set>
    </class>
</hibernate-mapping>

 

 结果:

测验代码:

五:最终咱们就足以来张开大家的作业支出了(首要进行user的增加和删除改查操作卡塔 尔(阿拉伯语:قطر‎:

 

HIbernateTest.java

 

  1. 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=?  
  2. zhangsan  
  3. zhangsan  

代码:

在此之前的使用jdbc来進展接二连三数据库的法子是很麻烦的,这里就充足发挥了hibernate的实惠与优势了:

 

/**
 *
 */
package com.b510.examples;

Main.java

list二级缓存测试

import java.util.Set;

 

  1. package com.test.pojo;  
  2. import java.util.List;  
  3.   
  4. import org.hibernate.HibernateException;  
  5. import org.hibernate.Session;  
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.cfg.Configuration;  
  8. import org.hibernate.service.ServiceRegistry;  
  9. import org.hibernate.service.ServiceRegistryBuilder;  
  10. import org.junit.BeforeClass;  
  11. import org.junit.Test;  
  12.   
  13. public class UserTest {  
  14.       
  15.     private static SessionFactory sessionFactory = null;  
  16.     @BeforeClass  
  17.     public static void beforeClass() {  
  18.         Configuration configuration = new Configuration();  
  19.           
  20.   
  21.         try {  
  22.             configuration.configure();  
  23.         } catch (HibernateException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         }  
  27.               
  28.           
  29.         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();  
  30.         sessionFactory = configuration.buildSessionFactory(serviceRegistry);  
  31.     }   
  32.     @SuppressWarnings(“unchecked”)  
  33.     @Test  
  34.     public void testListEhcache() {  
  35.         Session session = sessionFactory.openSession();  
  36.         session.beginTransaction();  
  37.         List<User> users1 = (List<User>)session.createQuery(“from User”).setCacheable(true).list();  
  38.         for(User user : users1) {  
  39.             System.out.println(user.getName());  
  40.         }  
  41.         session.getTransaction().commit();  
  42.         session.close();  
  43.           
  44.         Session session2 = sessionFactory.openSession();  
  45.         session2.beginTransaction();  
  46.         List<User> users2 = (List<User>)session2.createQuery(“from User”).setCacheable(true).list();  
  47.         for(User user : users2) {  
  48.             System.out.println(user.getName());  
  49.         }  
  50.         session2.getTransaction().commit();  
  51.         session2.close();  
  52.     }  
  53. }  

import org.hibernate.Session;

[java] view
plain copy

 输出结果:

/**
 *
 * @author XHW
 *
 * @date 2011-7-18
 *
 */
public class HibernateTest {
 public static void main(String[] args) {
  new HibernateTest().update();
 }
 public void update(){
  Session
session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  Category category=(Category)session.get(Category.class, 1);
  System.out.println(“id:”+category.getId()+” 
,name:”+category.getName()+”,
description:”+category.getDescription());
  
  Set<Product> products=category.getProducts();
   
  session.getTransaction().commit();  
 }
 
 
}

 

  1. Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from User user0_  
  2. zhangsan  
  3. zhangsan  
  4. lisi  
  5. wangwu  
  6. zhangsan  
  7. zhangsan  
  8. lisi  
  9. wangwu  

运作效果:

 4858.com 104858.com 11

log4j:WARN No appenders could be found for logger
(org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
    select
        category0_.id as id1_0_,
        category0_.name as name1_0_,
        category0_.description as descript3_1_0_
    from
        users.category category0_
    where
        category0_.id=?
Hibernate:
    select
        products0_.category_id as category2_1_,
        products0_.id as id1_,
        products0_.id as id0_0_,
        products0_.category_id as category2_0_0_,
        products0_.name as name0_0_,
        products0_.price as price0_0_,
        products0_.descripton as descripton0_0_
    from
        users.product products0_
    where
        products0_.category_id=?
id:1  ,name:java, description:java好啊
和测量试验代码风流倜傥的运作结果互相相比,大家会意识,此番运维结果用了两条select语句。不过我们会意识

  1. <span style=”font-size:14px;”>package toone.com.cn;  
  2. import java.util.Date;  
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.Transaction;  
  7. import org.hibernate.cfg.Configuration;  
  8. import toone.com.cn.bo.User;  
  9. public class Main {  
  10.     public static void main(String[] args){   
  11. //这里相对注意,无法写成Configuration cfg = new Configuration();不然会报Hibernate Dialect must be explicitly set 错误音讯将大家错误的指导  
  12. //;实际上前边大家早已布置了mysql的方言;  
  13.         Configuration cfg = new Configuration().configure();//对于configure()方法,大家得以引进其源代码进行查看,其会在类路  
  14. //径下自动去加载二个暗中同意的hibernate.cfg.xml文件;如若大家想换别的名字,能够行使其重载方法,具体可以查看其源代码(下载的缩短包中有卡塔 尔(英语:State of Qatar)  
  15.         SessionFactory factory = cfg.buildSessionFactory();  
  16.         User user = new User();  
  17.         user.setName(“Kobi”);  
  18.         user.setBirthday(new Date());  
  19.         Session session = null;  
  20.         Transaction tx = null;  
  21.         try {  
  22.             session = factory.openSession();  
  23.             tx = session.beginTransaction();//开启事务  
  24.             session.save(user);//举办封存  
  25.             tx.commit();//提交业务  
  26.         } catch (HibernateException e) {  
  27.             if(tx!=null){  
  28.                 tx.rollback();//回滚事务  
  29.             }  
  30.             throw e;//必得抛出非常  
  31.         }finally{  
  32.             if(session!=null){  
  33.                 session.close();//关闭session  
  34.             }  
  35.         }  
  36.     }  
  37. }</span>  

其次条select语句,对于我们的需若是无需的,他唯有叁个用场正是据有大家的程序实践时间。当然,

 

这是大家不希望观看的结果。

好了,一个丰硕效果就已经达成,但是写到这里,大家可能开采大家每实行一回操作,举个例子增加,改善,删除,查找都须求推行这段代码:

貌似景观下,Hibernate会私下认可给大家设置延迟加载。lazy=”true”
,那样会晋级我们的种类质量,所以日常景观下,大家不会去

 

安装lazy=”false”,当然在优越的图景下,我们务供给撤消延迟加载的时候,大家就把lazy=”false”,就能够了

[java] view
plain copy

 

 4858.com 124858.com 13

  1. Configuration cfg = new Configuration().configure();  
  2. SessionFactory factory = cfg.buildSessionFactory();  

 

这段代码特别耗质量,因为它每便都须求去加载深入剖析配置文件hibernate.cfg.xml,并且每趟都亟需创立session;因而我们不要紧本人创办三个工具类,采取单利的秘诀来开展贯彻,并且该工具类完成实体的增加和删除改查,代码如下:

 

HibernateUtils.java

 

[java] view
plain copy

 

 4858.com 144858.com 15

  1. <span style=”font-size:14px;”>package toone.com.cn.util;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import org.hibernate.HibernateException;  
  6. import org.hibernate.Session;  
  7. import org.hibernate.SessionFactory;  
  8. import org.hibernate.Transaction;  
  9. import org.hibernate.cfg.Configuration;  
  10.   
  11. public class HibernateUtils {  
  12.     private static SessionFactory sessionfactory;  
  13.     private HibernateUtils(){}  
  14.     static{  
  15.     Configuration cfg = new Configuration().configure();  
  16.     sessionfactory = cfg.buildSessionFactory();   
  17.     }  
  18.     public static Session getSession(){  
  19.         return sessionfactory.openSession();  
  20.     }  
  21.     //添加  
  22.     public static void add(Object obj){  
  23.         Session session = null;  
  24.         Transaction tx = null;  
  25.         try {  
  26.             session = HibernateUtils.getSession();  
  27.             tx = session.beginTransaction();  
  28.             session.save(obj);//分裂:save()方法若无拉开事务,它会进行一条插入语句,但自此由于没有交给业务,它又开展  
  29.             //session.persist(obj);//回滚了,而persist()方法在平昔不拉开事务的时候,它根本不会去试行,即未有那条插入语句  
  30.             tx.commit();  
  31.         }finally{  
  32.             if(session!=null){  
  33.                 session.close();  
  34.             }  
  35.         }  
  36.     }  
  37.     //修改  
  38.     public static void update(Object obj){  
  39.         Session session = null;  
  40.         Transaction tx = null;  
  41.         try {  
  42.             session = HibernateUtils.getSession();  
  43.             tx = session.beginTransaction();  
  44.             session.update(obj);  
  45.             tx.commit();  
  46.         }finally{  
  47.             if(session!=null){  
  48.                 session.close();  
  49.             }  
  50.         }  
  51.     }  
  52.     //删除  
  53.     public static void delete(Object obj){  
  54.         Session session = null;  
  55.         Transaction tx = null;  
  56.         try {  
  57.             session = HibernateUtils.getSession();  
  58.             tx = session.beginTransaction();  
  59.             session.delete(obj);  
  60.             tx.commit();  
  61.         }finally{  
  62.             if(session!=null){  
  63.                 session.close();  
  64.             }  
  65.         }  
  66.     }  
  67.     //查找 不供给打开事务  
  68.     public static Object findById(Class clazz,Serializable id){  
  69.         Session session = null;  
  70.         try {  
  71.             session = HibernateUtils.getSession();  
  72.         //这里需求区分一下get()与load()的界别,load()不会马上//去采访数据库只有在率先次利用的时候才会去加载(懒加载卡塔尔国;  
  73.         //load方法恒久不容许再次来到空对象(借使一纸空文,其会生出叁个user的子类)具体能够去查资料不一样那三个措施  
  74.             //Object obj = session.load(clazz, id);  
  75.             Object obj = session.get(clazz, id);return obj;}finally{if(session!=null){session.close();}}}}  
  76. </span>  

 

最终,贰个实体的增加和删除改查操作就完了了,下边大家能够重写Main.java文件来行使HibernateUtils工具类来对实业举办操作了:

Main.java

 

[java] view
plain copy

 

 4858.com 164858.com 17

  1. <span style=”font-size:14px;”>package toone.com.cn;  
  2. import java.util.Date;  
  3.   
  4.   
  5. import toone.com.cn.bo.User;  
  6. import toone.com.cn.util.HibernateUtils;  
  7.   
  8.   
  9. public class Main {  
  10.     public static void main(String[] args){  
  11.         User user = new User();  
  12.         user.setName(“Kobi”);  
  13.         user.setBirthday(new Date());  
  14.         HibernateUtils.add(user);//添加  
  15.         user.setName(“Jams”);  
  16.         HibernateUtils.update(user);//修改  
  17.         HibernateUtils.delete(user);//删除  
  18.         User user1 = (User) HibernateUtils.findById(User.class, user.getId());//查找  
  19.         System.out.println(user1.getName());  
  20.           
  21.     }  
  22. }</span>  

 

小结:掌握了Hibernate的中央效用,学会了利用其来开展增加和删除改查操作,算是职业之余的一点获得呢,未来还得继续坚定不移发帖,不断学习!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有