<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 析木 閱讀(770) 評論(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對象讀取的時候可以自動轉型為多種不同類型的SessionFactory,spring在裝配的時候如果發現實現了org.springframework.beans.factory.FactoryBean接口,就會使用

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

    我要啦免费统计
    主站蜘蛛池模板: 99爱视频99爱在线观看免费| 无码人妻精品中文字幕免费东京热| 久久亚洲国产中v天仙www| 无码成A毛片免费| 亚洲人AV在线无码影院观看| 亚洲人成色7777在线观看不卡| 久久精品国产免费一区| 久久亚洲国产成人影院| 久久久青草青青国产亚洲免观| 日韩免费高清大片在线| 在线视频亚洲一区| 亚洲AV美女一区二区三区| 日本特黄特色aa大片免费| 中文字幕无码免费久久| 亚洲欧洲国产综合AV无码久久| 中文字幕精品无码亚洲字| 永久免费毛片在线播放| 99在线热播精品免费99热| 亚洲av综合av一区二区三区 | 国产一级一片免费播放i| 久久国产乱子伦精品免费不卡| 亚洲AV无码成人精品区狼人影院| 亚洲va久久久噜噜噜久久| 国产成人免费一区二区三区| 免费A级毛片无码视频| 污视频网站免费观看| 亚洲不卡中文字幕| 亚洲国产精品无码专区| 国产大片免费观看中文字幕| 国产成人免费在线| 今天免费中文字幕视频| 疯狂做受xxxx高潮视频免费| 亚洲AV无码一区二区三区在线| 亚洲av综合色区| 国产精品亚洲玖玖玖在线观看 | 久久福利资源网站免费看| 在线毛片片免费观看| 国产精品成人啪精品视频免费| 亚洲爆乳少妇无码激情| 精品国产日韩久久亚洲| 亚洲精品午夜视频|