<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 14, comments - 15, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Hibernate學習小結――Hibernate正向工程hbm2ddl(轉)

    Posted on 2010-03-16 17:16 析木 閱讀(780) 評論(0)  編輯  收藏 所屬分類: Hibernate

    一般在項目開發過程中,使用比較多的就是先建好表,再利用hibernate反向工程生成*.hbm.xml文件跟POJO類,個人認為由于目前所使用的數據庫都是關系數據庫,而hibernate作為一個ORM,把對數據庫的操作都對象化了,更應當從對象出發,生成數據庫里面相關表,這樣更加符合人認知事物的習慣。

    由于hibernate3提供了自帶的工具hbm2ddl,建立根據你的對象建立數據庫是一件非常簡單的事情。

    SchemaExport工具:Hibernatehbm2dll提供SchemaExport工具,給定一個連接字符串和映射文件,不需輸入其他東西就可以按照持久化類和映射文件自動生成數據庫架構,現在SchemaExport工具還不是很強大,但是一般應用足夠了,它還是一個相當原始的API還在不斷改進。SchemaExport工具就是把DDL腳本輸出到標準輸出,同時/或者執行DDL語句。SchemaExport工具提供了三個方法,分別是Drop()Create()Execute(),前兩個方法實質是調用Execute()方法。通常使用Execute()方法來生成數據庫架構的。

    SchemaUpdate工具:Hibernate2.0中新添加SchemaUpdate工具,可以用來更新數據庫架構。但是我覺得沒有什么作用,因為它不能Drop現有的表或列,也不能更新現有的列,只能添加新的表和列。如果我需要刪除表或者列或者修改其中列,SchemaUpdate工具就顯得無能為力了。

    SchemaValidator工具:SchemaValidator工具,可以用來檢查數據庫架構。通過映射文件中配置的相關數據庫表及各自的字段屬性來檢查數據庫中對應表結構是否存在或正確,如果不存在表或字段不一致,則拋出異常。

     

    對于單純的Hibernate,配置有hibernate.cfg.xml數據庫配置文件,或是其它SSH整合版本中也配置有相關.cfg.xml文件的工程來說,這種類型的情況下使用HibernateSchemaExport實現正向工程比較簡單如下例:

    public boolean createTableByBean(String mappingFile) {

           Configuration cfg = new Configuration().configure(cfgFile);

           cfg.addFile(mappingFile);

           boolean flag = true;

           SchemaExport dbExport = new SchemaExport(cfg);

           try {

               dbExport.create(truetrue);

           catch (Exception e) {

               flag = false;

           }

           return flag;

    }

    而我所做的數據遷移工具中使用的是Spring+Hibernate整合框架,而且在數據庫配置中沒有使用hibernate.propertieshibernate.cfg.xml文件來配置,

    因為在使用HibernateSchemaExport/SchemaUpdate/SchemaValidator工具時,構建對象時需要HibernateConfiguration對象實例作為參數。如:

    var export = new SchemaExport(cfg); 其中cfg參數由

    Configuration cfg = new Configuration().configure(cfgFile);建立,configure默認讀取hibernate.cfg.xml配置文件(configure無參函數)

    也可以通過傳遞參數指定自己定義的.cfg.xml文件。我的SessionFactory是借助于Spring提供的

    org.springframework.orm.hibernate3.LocalSessionFactoryBean來實現的:

    <bean id="targetSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        ……

     </bean>

    在沒有配置.cfg.xml文件的情況下,可以通過配置的數據源的SessionFactory中獲取,如下:

    public class DaoUtil extends HibernateDaoSupport {

    private Configuration cfg;

    private Settings settings;

    public void init() {

         String webRootPath = CommonMethod.getWebRootPath();

         ApplicationContext dataSource_ctx = new FileSystemXmlApplicationContext(webRootPath + "/WEB-INF/datatransferConf/applicationContext-targetDataSource.xml");

         SessionFactoryImplementor sessionFactoryImpl = (SessionFactoryImplementor) dataSource_ctx.getBean("targetSessionFactory");

         LocalSessionFactoryBean localSessionFactory = (LocalSessionFactoryBean) dataSource_ctx.getBean("&targetSessionFactory");

         SessionFactory sessionFactory = (SessionFactory) dataSource_ctx.getBean("targetSessionFactory");

         this.cfg = localSessionFactory.getConfiguration();

         this.settings = sessionFactoryImpl.getSettings();

         super.setSessionFactory(sessionFactory);

    }

    public void createTableFromCfg() {

          if (settings.isAutoCreateSchema()) {

             new SchemaExport(cfgsettings).create(truetrue);

          else if (settings.isAutoUpdateSchema()) {

                new SchemaUpdate(cfgsettings).execute(truetrue);

            else if (settings.isAutoDropSchema()) {

              new SchemaExport(cfgsettings).drop(truetrue);

            else if (settings.isAutoValidateSchema()) {

              new SchemaValidator(cfg).validate();

            }

    }

    public void createTableFromMapFile(String mappingFile) {

          Resource mappingLocation = new ClassPathResource(mappingFile);

                  try {

             cfg.addInputStream(mappingLocation.getInputStream());

         catch (MappingException e1) {

             e1.printStackTrace();

         catch (IOException e1) {

             e1.printStackTrace();

         }

         createTableFromCfg();

     }

    }

     

    SchemaExport create(script,export)方法根據持久類和映射文件先刪除架構后創建刪除數據庫架構。有兩個參數,第一個為True就是把DDL語句輸出到控制臺,第二個為True就是根據持久類和映射文件先執行刪除再執行創建操作,經過調試可以發現這個方法其實質是執行execute(script,export, false, true)方法。execute(script, export, justDrop, format)方法根據持久類和映射文件先刪除架構后創建刪除數據庫架構。有四個參數,第一個為True就是把DDL語句輸出到控制臺;第二個為True就是根據持久類和映射文件在數據庫中先執行刪除再執行創建操作;第三個為false表示不是僅僅執行Drop語句還執行創建操作,這個參數的不同就擴展了上面兩個方法;第四個參數為false表示不是格式化輸出DDL語句到控制臺,是在一行輸出的。

     

    Spring配置文件中所定義的LocalSessionFactoryBean實現了org.springframework.beans.factory.FactoryBean接口,在使用ApplicationContext對象讀取的時候可以自動轉型為多種不同類型的SessionFactoryspring在裝配的時候如果發現實現了org.springframework.beans.factory.FactoryBean接口,就會使用

    FactoryBean#getObject() 方法返回的對象裝配,具體的可以看下文檔。如果你想拿到LocalSessionFactoryBean實例id前面加個'&'就可以了,在你的配置文件中BeanFactory.getBean('&sessionFactory')拿到的就是LocalSessionFactoryBean的實例。

    我要啦免费统计
    主站蜘蛛池模板: 久久亚洲国产中v天仙www | 国产99精品一区二区三区免费| 亚洲视频一区二区三区| 亚洲?V乱码久久精品蜜桃| 无码国产精品一区二区免费I6| 视频免费在线观看| 无码精品人妻一区二区三区免费| 亚洲国产精品免费观看| 91亚洲va在线天线va天堂va国产| 国产精品亚洲二区在线观看 | 亚洲欧美日韩中文字幕在线一区| 亚洲欧洲一区二区| 亚洲日韩国产精品第一页一区| 国产成人啪精品视频免费网| 久久天天躁狠狠躁夜夜免费观看| 免费一级毛片在线播放视频| 一级一片免费视频播放| 美女裸体无遮挡免费视频网站| 亚洲色大成网站www| 亚洲免费一级视频| 亚洲欧洲日本天天堂在线观看| 亚洲A∨无码无在线观看| 在线a亚洲v天堂网2019无码| 亚洲午夜激情视频| 亚洲精品成人片在线观看| 国产在线观看免费不卡 | 亚洲成在人线在线播放无码| 91亚洲国产成人久久精品网址| 久久精品国产亚洲av影院| 亚洲男人都懂得羞羞网站| 亚洲成A人片777777| 亚洲AV永久无码区成人网站| 亚洲国产精品无码成人片久久| 国产精品亚洲аv无码播放| 亚洲精品狼友在线播放| 亚洲国产精品无码AAA片| 亚洲第一中文字幕| 亚洲黄色在线视频| 亚洲一区动漫卡通在线播放| 中文字幕 亚洲 有码 在线 | 日韩高清在线高清免费|