<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的實例。

    我要啦免费统计
    主站蜘蛛池模板: h视频在线观看免费网站| 亚洲精品中文字幕无码A片老| 全黄A免费一级毛片| 妞干网免费视频观看| 最新亚洲卡一卡二卡三新区| 青草草色A免费观看在线| 亚洲精品美女久久久久| 91成人免费观看| 亚洲欧洲视频在线观看| 免费福利视频导航| 亚洲欧洲日韩在线电影| xxxxwww免费| 亚洲一日韩欧美中文字幕在线| 最新中文字幕免费视频| 精品亚洲福利一区二区| 亚洲欧洲日产国码高潮αv| 国产黄在线播放免费观看| 亚洲人成伊人成综合网久久久| 免费看搞黄视频网站| 亚洲一区二区三区日本久久九| 永久在线免费观看| jiz zz在亚洲| 亚洲精品第一国产综合精品99| 国产在线观看xxxx免费| 亚洲一级二级三级不卡| 妞干网免费视频观看| 深夜久久AAAAA级毛片免费看| 亚洲乱码一区二区三区在线观看| 日本高清免费观看| 精品国产成人亚洲午夜福利| 国产v片免费播放| 中文字幕在线视频免费| 亚洲精品中文字幕乱码影院| 国产精品久免费的黄网站| 国产精品福利在线观看免费不卡| 久久青青草原亚洲AV无码麻豆| 国产va免费精品观看精品| 无套内谢孕妇毛片免费看看| 亚洲阿v天堂在线| 毛片免费全部播放一级| 中文字幕成人免费高清在线|