日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

跟我学Spring3(8.2):对ORM的支持之集成Hibernate3

發(fā)布時(shí)間:2025/6/15 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跟我学Spring3(8.2):对ORM的支持之集成Hibernate3 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

8.2? 集成Hibernate3

Hibernate是全自動(dòng)的ORM框架,能自動(dòng)為對(duì)象生成相應(yīng)SQL并透明的持久化對(duì)象到數(shù)據(jù)庫。

Spring2.5+版本支持Hibernate 3.1+版本,不支持低版本,Spring3.0.5版本提供對(duì)Hibernate 3.6.0 Final版本支持。

8.2.1? 如何集成

Spring通過使用如下Bean進(jìn)行集成Hibernate:

  • LocalSessionFactoryBean :用于支持XML映射定義讀取:

configLocation和configLocations:用于定義Hibernate配置文件位置,一般使用如classpath:hibernate.cfg.xml形式指定;

mappingLocations :用于指定Hibenate映射文件位置,如chapter8/hbm/user.hbm.xml;

hibernateProperties:用于定義Hibernate屬性,即Hibernate配置文件中的屬性;

dataSource:定義數(shù)據(jù)源;

hibernateProperties、dataSource用于消除Hibernate配置文件,因此如果使用configLocations指定配置文件,就不要設(shè)置這兩個(gè)屬性了,否則會(huì)產(chǎn)生重復(fù)配置。推薦使用dataSource來指定數(shù)據(jù)源,而使用hibernateProperties指定Hibernate屬性。

  • AnnotationSessionFactoryBean:用于支持注解風(fēng)格映射定義讀取,該類繼承LocalSessionFactoryBean并額外提供自動(dòng)查找注解風(fēng)格配置模型的能力:

annotatedClasses:設(shè)置注解了模型類,通過注解指定映射元數(shù)據(jù)。

packagesToScan:通過掃描指定的包獲取注解模型類,而不是手工指定,如“cn.javass.**.model”將掃描cn.javass包及子包下的model包下的所有注解模型類。

接下來學(xué)習(xí)一下Spring如何集成Hibernate吧:

1、準(zhǔn)備jar包:

首先準(zhǔn)備Spring對(duì)ORM框架支持的jar包:

org.springframework.orm-3.0.5.RELEASE.jar? //提供對(duì)ORM框架集成

下載hibernate-distribution-3.6.0.Final包,獲取如下Hibernate需要的jar包:

hibernate3.jar?????????????????????? //核心包

lib\required\antlr-2.7.6.jar????????????? //HQL解析時(shí)使用的包

lib\required\javassist-3.9.0.GA.jar?????? //字節(jié)碼類庫,類似于cglib

lib\required\commons-collections-3.1.jar? //對(duì)集合類型支持包,前邊測(cè)試時(shí)已經(jīng)提供過了,無需再拷貝該包了

lib\required\dom4j-1.6.1.jar??????????? //xml解析包,用于解析配置使用

lib\required\jta-1.1.jar???????????????? //JTA事務(wù)支持包

lib\jpa\hibernate-jpa-2.0-api-1.0.0.Final.jar //用于支持JPA

下載slf4j-1.6.1.zip(http://www.slf4j.org/download.html),slf4j是日志系統(tǒng)門面(Simple Logging Facade for Java),用于對(duì)各種日志框架提供給一致的日志訪問接口,從而能隨時(shí)替換日志框架(如log4j、java.util.logging):

slf4j-api-1.6.1.jar???????? ?????//核心API

slf4j-log4j12-1.6.1.jar????????? //log4j實(shí)現(xiàn)

將這些jar包添加到類路徑中。

2、對(duì)象模型定義,此處使用第七章中的UserModel:

java代碼:
1 2 3 4 5 6 package cn.javass.spring.chapter7; public class UserModel { ????private int id; ????private String myName; ????//省略getter和setter }

3、Hibernate映射定義(chapter8/hbm/user.hbm.xml),定義對(duì)象和數(shù)據(jù)庫之間的映射:

java代碼:
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC ????????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ????????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> ????<class name="cn.javass.spring.chapter7.UserModel" table="test"> ????????<id name="id" column="id"><generator class="native"/></id> ????????<property name="myName" column="name"/> ????</class> </hibernate-mapping>

?

4、???數(shù)據(jù)源定義,此處使用第7章的配置文件,即“chapter7/applicationContext-resources.xml”文件。

5、???SessionFactory配置定義(chapter8/applicationContext-hibernate.xml):

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ????<property name="dataSource" ref="dataSource"/> <!-- 指定數(shù)據(jù)源 --> ??????<property name="mappingResources">???? <!-- 指定映射定義 --> ????????<list> ??????????<value>chapter8/hbm/user.hbm.xml</value> ????????</list> ??????</property> ??????<property name="hibernateProperties">?? <!--指定Hibernate屬性 --> ????????<props> ??????????<prop key="hibernate.dialect"> ??????????????org.hibernate.dialect.HSQLDialect ??????????</prop> ????????</props> ??????</property> </bean>

6、???獲取SessionFactory:

java代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 package cn.javass.spring.chapter8; //省略import public class HibernateTest { ????private static SessionFactory sessionFactory; ????@BeforeClass ????public static void beforeClass() { ????????String[] configLocations = new String[] { ????????????????"classpath:chapter7/applicationContext-resources.xml", ????????????????"classpath:chapter8/applicationContext-hibernate.xml"}; ????????ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); ????????sessionFactory = ctx.getBean("sessionFactory", SessionFactory.class); } }

此處我們使用了chapter7/applicationContext-resources.xml定義的“dataSource”數(shù)據(jù)源,通過ctx.getBean(“sessionFactory”, SessionFactory.class)獲取SessionFactory。

7、通過SessionFactory獲取Session對(duì)象進(jìn)行創(chuàng)建和刪除表:

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 @Before public void setUp() { ??//id自增主鍵從0開始 ??final String createTableSql = "create memory table test" + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " + "name varchar(100))"; ??sessionFactory.openSession(). ??createSQLQuery(createTableSql).executeUpdate(); } @After public void tearDown() { ????final String dropTableSql = "drop table test"; ????sessionFactory.openSession(). ????createSQLQuery(dropTableSql).executeUpdate(); }

使用SessionFactory創(chuàng)建Session,然后通過Session對(duì)象的createSQLQuery創(chuàng)建本地SQL執(zhí)行創(chuàng)建和刪除表。

8、使用SessionFactory獲取Session對(duì)象進(jìn)行持久化數(shù)據(jù):

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test public void testFirst() { ????Session session = sessionFactory.openSession(); ????Transaction transaction = null; ????try { ????????transaction = beginTransaction(session); ????????UserModel model = new UserModel(); ????????model.setMyName("myName"); ????????session.save(model); ????} catch (RuntimeException e) { ????????rollbackTransaction(transaction); ????????throw e; ????} finally { ????????commitTransaction(session); ????} }
java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 private Transaction beginTransaction(Session session) { ????Transaction transaction = session.beginTransaction(); ????transaction.begin(); ????return transaction; } private void rollbackTransaction(Transaction transaction) { ???if(transaction != null) { ????????transaction.rollback(); ????} } private void commitTransaction(Session session) { ????session.close(); }

使用SessionFactory獲取Session進(jìn)行操作,必須自己控制事務(wù),而且還要保證各個(gè)步驟不會(huì)出錯(cuò),有沒有更好的解決方案把我們從編程事務(wù)中解脫出來?Spring提供了HibernateTemplate模板類用來簡(jiǎn)化事務(wù)處理和常見操作。

8.2.2?使用HibernateTemplate

HibernateTimplate模板類用于簡(jiǎn)化事務(wù)管理及常見操作,類似于JdbcTemplate模板類,對(duì)于復(fù)雜操作通過提供HibernateCallback回調(diào)接口來允許更復(fù)雜的操作。

接下來示例一下HibernateTemplate的使用:

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Test public void testHibernateTemplate() { HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory); ????final UserModel model = new UserModel(); ????model.setMyName("myName"); ????hibernateTemplate.save(model); ????//通過回調(diào)允許更復(fù)雜操作 ????hibernateTemplate.execute(new HibernateCallback<Void>() { ????????@Override ????????public Void doInHibernate(Session session) ????????????throws HibernateException, SQLException { ????????????session.save(model); ????????????return null; ????????}}); }

通過new HibernateTemplate(sessionFactory) 創(chuàng)建HibernateTemplate模板類對(duì)象,通過調(diào)用模板類的save方法持久化對(duì)象,并且自動(dòng)享受到Spring管理事務(wù)的好處。

而且HibernateTemplate 提供使用HibernateCallback回調(diào)接口的方法execute用來支持復(fù)雜操作,當(dāng)然也自動(dòng)享受到Spring管理事務(wù)的好處。

8.2.3? 集成Hibernate及最佳實(shí)踐

類似于JdbcDaoSupport類,Spring對(duì)Hibernate也提供了HibernateDaoSupport類來支持一致的數(shù)據(jù)庫訪問。HibernateDaoSupport也是DaoSupport實(shí)現(xiàn):

接下來示例一下Spring集成Hibernate的最佳實(shí)踐:

1、?定義Dao接口,此處使用cn.javass.spring.chapter7.dao. IUserDao:

2、?定義Dao接口實(shí)現(xiàn),此處是Hibernate實(shí)現(xiàn):

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package cn.javass.spring.chapter8.dao.hibernate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import cn.javass.spring.chapter7.UserModel; import cn.javass.spring.chapter7.dao.IUserDao; public class UserHibernateDaoImpl extends HibernateDaoSupport implements IUserDao { ????private static final String COUNT_ALL_HQL = "select count(*) from UserModel"; ????@Override ????public void save(UserModel model) { ????????getHibernateTemplate().save(model); ????} ????@Override ????public int countAll() { ????????Number count = (Number) getHibernateTemplate().find(COUNT_ALL_HQL).get(0); ????????return count.intValue(); ????} }

此處注意首先Hibernate實(shí)現(xiàn)放在dao.hibernate包里,其次實(shí)現(xiàn)類命名如UserHibernateDaoImpl,即×××HibernateDaoImpl,當(dāng)然如果自己有更好的命名規(guī)范可以遵循自己的,此處只是提個(gè)建議。

3、進(jìn)行資源配置,使用resources/chapter7/applicationContext-resources.xml:

4、dao定義配置,在chapter8/applicationContext-hibernate.xml中添加如下配置:

java代碼:
1 2 3 4 <bean id="abstractDao" abstract="true"> ????<property name="sessionFactory" ref="sessionFactory"/> </bean>?? <bean id="userDao"? class="cn.javass.spring.chapter8.dao.hibernate.UserHibernateDaoImpl" parent="abstractDao"/>

首先定義抽象的abstractDao,其有一個(gè)sessionFactory屬性,從而可以讓繼承的子類自動(dòng)繼承sessionFactory屬性注入;然后定義userDao,且繼承abstractDao,從而繼承sessionFactory注入;我們?cè)诖私o配置文件命名為applicationContext-hibernate.xml表示Hibernate實(shí)現(xiàn)。

5、?最后測(cè)試一下吧(cn.javass.spring.chapter8. HibernateTest):

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 @Test public void testBestPractice() { ????String[] configLocations = new String[] { ????????????"classpath:chapter7/applicationContext-resources.xml", ????????????"classpath:chapter8/applicationContext-hibernate.xml"}; ????ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations); ????IUserDao userDao = ctx.getBean(IUserDao.class); ????UserModel model = new UserModel(); ????model.setMyName("test"); ????userDao.save(model); ????Assert.assertEquals(1, userDao.countAll()); }

和Spring JDBC框架的最佳實(shí)踐完全一樣,除了使用applicationContext-hibernate.xml代替了applicationContext-jdbc.xml,其他完全一樣。也就是說,DAO層的實(shí)現(xiàn)替換可以透明化。

8.2.4? Spring+Hibernate的CRUD

Spring+Hibernate CRUD(增刪改查)我們使用注解類來示例,讓我們看具體示例吧:

1、首先定義帶注解的模型對(duì)象UserModel2:

  • 使用JPA注解@Table指定表名映射;
  • 使用注解@Id指定主鍵映射;
  • 使用注解@ Column指定數(shù)據(jù)庫列映射;
java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package cn.javass.spring.chapter8; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "test") public class UserModel2 { ????@Id @GeneratedValue(strategy = GenerationType.AUTO) ????private int id; ????@Column(name = "name") ????private String myName; ????//省略getter和setter }

2、?定義配置文件(chapter8/applicationContext-hibernate2.xml):

2.1、????????定義SessionFactory:

此處使用AnnotationSessionFactoryBean通過annotatedClasses屬性指定注解模型來定義映射元數(shù)據(jù);

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/>? <!-- 1、指定數(shù)據(jù)源 --> ??<property name="annotatedClasses">?????????? <!-- 2、指定注解類 --> ?????<list><value>cn.javass.spring.chapter8.UserModel2</value></list> </property> ??<property name="hibernateProperties"><!-- 3、指定Hibernate屬性 --> ????<props> ?????<prop key="hibernate.dialect"> ????????org.hibernate.dialect.HSQLDialect ?????</prop> ????</props> ??</property> </bean>

2.2、定義HibernateTemplate?:

java代碼:
1 2 3 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> ????<property name="sessionFactory" ref="sessionFactory"/> </bean>

3、最后進(jìn)行CURD測(cè)試吧:

java代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 @Test public void testCURD() { ????String[] configLocations = new String[] { ????????????"classpath:chapter7/applicationContext-resources.xml", ????????????"classpath:chapter8/applicationContext-hibernate2.xml"}; ????ApplicationContext ctx =? new ClassPathXmlApplicationContext(configLocations); ????HibernateTemplate hibernateTemplate =? ctx.getBean(HibernateTemplate.class); ????UserModel2 model = new UserModel2(); ????model.setMyName("test"); ????insert(hibernateTemplate, model); ????select(hibernateTemplate, model); ????update(hibernateTemplate, model); ????delete(hibernateTemplate, model); } private void insert(HibernateTemplate hibernateTemplate, UserModel2 model) { ????hibernateTemplate.save(model); } private void select(HibernateTemplate hibernateTemplate, UserModel2 model) { ????UserModel2 model2 = hibernateTemplate.get(UserModel2.class, 0); ????Assert.assertEquals(model2.getMyName(), model.getMyName()); ????List<UserModel2> list = hibernateTemplate.find("from UserModel2"); ????Assert.assertEquals(list.get(0).getMyName(), model.getMyName()); } private void update(HibernateTemplate hibernateTemplate, UserModel2 model) { ????model.setMyName("test2"); ????hibernateTemplate.update(model); } private void delete(HibernateTemplate hibernateTemplate, UserModel2 model) { ????hibernateTemplate.delete(model); }

Spring集成Hibernate進(jìn)行增刪改查是不是比Spring JDBC方式簡(jiǎn)單許多,而且支持注解方式配置映射元數(shù)據(jù),從而減少映射定義配置文件數(shù)量。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的跟我学Spring3(8.2):对ORM的支持之集成Hibernate3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成年人黄色片网站 | 欧美精品不卡 | 日日摸日日碰夜夜爽无码 | 国产一区二区三区四区五区美女 | 性欢交69国产精品 | 在线免费观看污网站 | 黄色爱爱视频 | 日批视频免费播放 | 快播91| 美女精品在线 | aaaa级片| 少妇被黑人到高潮喷出白浆 | 美女露胸无遮挡 | 国产毛片aaa | 午夜寂寞影院在线观看 | 国产69精品久久久 | 日韩精品在线观看AV | 成人美女免费网站视频 | 天天躁日日躁狠狠躁伊人 | 免费看黄色一级大片 | 麻豆成人网 | 久久综合久久综合久久综合 | 精品欧美视频 | 天天夜夜啦啦啦 | 性做久久久久 | 在线观看涩涩视频 | 亚洲风情av | www.在线视频 | 国产精欧美一区二区三区白种人 | 少妇又紧又色又爽又刺激 | 成 人 黄 色 片 在线播放 | 一区二区三区在线看 | 精品女厕偷拍一区二区 | 中文字幕一区二区av | 亚洲精品播放 | 亚洲av中文无码乱人伦在线观看 | 青青操91| 欲色影音| 久久精品2 | 黄色欧美视频 | 亚洲s码欧洲m码国产av | 欧美一区成人 | 中文字幕观看 | 91文字幕巨乱亚洲香蕉 | 国产成人黄色av | 99九九视频 | 久久这里只有精品久久 | 国产黄色片在线 | 精品伦精品一区二区三区视频 | 玖玖视频在线 | 69精品一区二区三区 | 精品无码久久久久久久久成人 | 久久久无码一区二区三区 | 欧美视频免费在线观看 | 亚洲天堂一二三 | 日韩欧美成 | 粉嫩av蜜桃av蜜臀av | 免费视频色 | 久久九九爱 | 亚洲AV无码成人精品区在线观 | 亚洲欧美日韩天堂 | 国产一区二区在线播放视频 | aaa一级黄色片 | av网在线 | 九九视频这里只有精品 | 69sex久久精品国产麻豆 | 日韩av线上 | 色老头综合网 | 国产日韩网站 | 日本久久爱 | 午夜写真片福利电影网 | 总裁憋尿呻吟双腿大开憋尿 | 中文字幕一区二区人妻痴汉电车 | 国产剧情一区二区三区 | a级片一区二区 | 日韩乱码人妻无码中文字幕久久 | 免费毛片网站在线观看 | 韩国明星乱淫(高h)小说 | 欧美成人一区二区三区片免费 | 毛片高清免费 | 免费在线观看黄色网址 | 好男人网站 | 国产在线精品一区二区三区 | 精品一区二区人妻 | 午夜a视频 | 性——交——性——乱免费的 | 国产精品啊啊啊 | 日韩无码专区 | 岛国在线视频 | 校园春色 亚洲色图 | www.777色| 都市激情av | 一级黄色性生活视频 | 国精品一区二区三区 | 污视频网站免费 | 手机天堂网 | 久草福利在线观看 | 欧美va亚洲va | 中文字幕一区二区三 |