Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks
          此方法在快速建立項目原型上有很大幫助(這最關鍵的就是速度,用的好原型很快就能建立起來)

          先確定下“快速原型”環境定義:
            使用:ant+hibernate_xdoclet+hibernate_create_table
            過程:定義bean(xdoclet) -> hbm映射文件 -> hibernate.hbm2ddl.auto create -> 邏輯
            注意:如有使用泛型,請使用 > xjavadoc-1.1.jar

          build.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <project>
              
          <property file="build-dist.properties" />

              
          <path id="class.path">
                  
          <fileset dir="${ant.lib.dir}">
                      
          <include name="*.jar" />
                  
          </fileset>
                  
          <fileset dir="${project.lib.dir}">
                      
          <include name="*.jar" />
                  
          </fileset>
              
          </path>

              
          <!-- =================================================================== -->
              
          <!-- Initialise                                                          -->
              
          <!-- =================================================================== -->
              
          <target name="init">
                  
          <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="class.path" />
              
          </target>

              
          <!-- =================================================================== -->
              
          <!-- Invoke XDoclet's hibernate                                          -->
              
          <!-- =================================================================== -->
              
          <target name="hibernate" depends="init">

                  
          <echo>+---------------------------------------------------+</echo>
                  
          <echo>|                                                   |</echo>
                  
          <echo>| R U N N I N G   H I B E R N A T E D O C L E T     |</echo>
                  
          <echo>|                                                   |</echo>
                  
          <echo>+---------------------------------------------------+</echo>

                  
          <hibernatedoclet destdir="${config.dir}" mergedir="${config.dir}" excludedtags="@version,@author,@todo,@see" addedtags="@xdoclet-generated at ${TODAY},@copyright The XDoclet Team,@author XDoclet,@version ${version}" force="${samples.xdoclet.force}" verbose="false">
                      
          <fileset dir="${src.dir}">
                          
          <include name="bean/**/*.java" />
                      
          </fileset>
                      
          <hibernate version="3.0" />
                  
          </hibernatedoclet>

              
          </target>

          </project>


          ant配置文件
          # 當然根據你自己的項目路徑
          ant.lib.dir 
          = C:\\src\\test\\hbmTest\\action\\lib
          project.lib.dir
          = C:\\src\\test\\hbmTest\\lib
          src.dir 
          = C:\\src\\test\\hbmTest\\src
          config.dir 
          = C:\\src\\test\\hbmTest\\config



          hibernate.hbm.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC
                  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
          >
          <hibernate-configuration>
              
          <session-factory>
                  
          <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
                  
          <property name="connection.url">
                      
          <![CDATA[             
                      jdbc:mysql://localhost:3306/hbm?characterEncoding=utf8&connectionCollation=gbk_chinese_ci
                      
          ]]>
                  
          </property>
                  
          <property name="hibernate.connection.username">root</property>
                  
          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
                  
          <property name="hibernate.connection.password">******</property>
                  
          <property name="hibernate.hbm2ddl.auto">create</property>
                  
          <property name="hibernate.show_sql">true</property>
                  <!-- 映射添加 -->
                  
          <mapping resource="bean\unidirectional\m2o\Person.hbm.xml"/>
                  
          <mapping resource="bean\unidirectional\m2o\Address.hbm.xml"/>
                  
              
          </session-factory>
          </hibernate-configuration>



          下面就詳細介紹了第一個
          單項一對多
          1.先定義bean
          package bean.unidirectional.m2o;
          /**
           * @hibernate.class

           
          */
          public class Person {
              
          private int id;
              
          private Address address;

              
          /**
               * @hibernate.id generator-class = "native"

               
          */
              
          public int getId() {
                  
          return id;
              }

              
          public void setId(int id) {
                  
          this.id = id;
              }

              
          /**
               * @hibernate.many-to-one column = "addressId" not-null = "true"

               
          */
              
          public Address getAddress() {
                  
          return address;
              }

              
          public void setAddress(Address address) {
                  
          this.address = address;
              }
          }


          package bean.unidirectional.m2o;

          /**
           * @hibernate.class

           
          */
          public class Address {
              
          private int id;

              
          /**
               * @hibernate.id generator-class = "native"
               
          */
              
          public int getId() {
                  
          return id;
              }

              
          public void setId(int id) {
                  
          this.id = id;
              }

          }

          2.運行 ant hibernate 得到 hbm 映射文件

          3.Main 運行測試


          import java.util.List;

          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.hibernate.Transaction;

          import util.HibernateUtil;
          import bean.unidirectional.m2o.Address;
          import bean.unidirectional.m2o.Person;

          public class Main {
              
          public static void main(String[] args) {
                  Session session1 
          = HibernateUtil.currentSession();
                  Transaction t1 
          = session1.beginTransaction();
                  
          //insert
                  Address address1 = new Address();
                  Address address2 
          = new Address();
                  
                  Person person1 
          = new Person();
                  Person person2 
          = new Person();
                      person1.setAddress(address1);
                      person2.setAddress(address1);
                  Person person3 
          = new Person();
                  person3.setAddress(address2);
                  
                  session1.save(address1);
                  session1.save(address2);
                  session1.save(person1);
                  session1.save(person2);
                  session1.save(person3);
                  t1.commit();
                  
                  
          //查詢有重復的 address 
                  Session session2 = HibernateUtil.currentSession();
                  Query query 
          = session2.createQuery(
                          
          " select ta from "+
                              Address.
          class.getName()+" ta , "+
                              Person.
          class.getName()+" tp "+
                          
          " where ta.id=tp.address "+
                          
          " group by ta.id having count(ta.id)>1 "
                  );
                  
                  List
          <Address> list =  query.list();
                  
          for(Address atmp : list ){
                      System.out.println( atmp.getId() );
                  }
              }
          }

          數據庫:
          mysql> show tables ;
          +-----------------------+
          | Tables_in_hbm  |
          +-----------------------+
          | address             |
          | person              |
          +-----------------------+
          結果:
          Hibernate: insert into Address values ( )
          Hibernate: insert into Address values ( )
          Hibernate: insert into Person (addressId) values (?)
          Hibernate: insert into Person (addressId) values (?)
          Hibernate: insert into Person (addressId) values (?)
          Hibernate: select address0_.id as id from Address address0_, Person person1_ where address0_.id=person1_.addressId group by address0_.id having count(address0_.id)>1
          1




          當然我這文章主要是映射關系,下面我們就進主題,大家想嘗試下可以使用上面的原型快速測試:參考(在此我對參考加入了自己的注解,希望能給大家幫助。對于在實際開發中不常見或難以實現的我們就不介紹了)

          單向一對一(one to one)

          #通過外鍵關聯
          <class name="Person">

          <id name="id" column="personId">

          <generator class="native"/>

          </id>

          <many-to-one name="address"

          column="addressId"

          unique="true"

          not-null="true"/>


          </class>



          <class name="Address">

          <id name="id" column="addressId">

          <generator class="native"/>

          </id>

          </class>
          create table Person ( personId bigint not null primary key, addressId bigint not null unique )

          create table Address ( addressId bigint not null primary key )


          #通過主鍵關聯(請注意,例子中掉換了關聯的方向
          <class name
          ="Person">
              <id name
          ="id" column="personId">
                  <generator class
          ="native"/>
              </id>
          </class>

          <class name
          ="Address">
              <id name
          ="id" column="personId">
                  <generator class
          ="foreign">
                      <param name
          ="property"
          >person</param>
                  </generator>

              </id>
              <one-to-one name
          ="person" constrained="true"/>
          </class>

          create table Person ( personId bigint not null primary key )
          create table Address ( personId bigint not null primary key )
                 

           

          單向一對多(one to many)

          <class name="Person">
              <id name
          ="id" column="personId">
                  <generator class
          ="native"/>
              </id>
              <set name
          ="addresses">
                  <key column
          ="personId" not-null="true"/>
                  <one-to-many class
          ="Address"
          />
              </set>

          </class>

          <class name
          ="Address">
              <id name
          ="id" column="addressId">
                  <generator class
          ="native"/>
              </id>
          </class>

          create table Person ( personId bigint not null primary key )
          create table Address ( addressId bigint not null primary key
          , personId bigint not null

          # 這里 當 ddl主鍵對象 會多出 n條 被外鍵對象的 update
          # 解決辦法修改映射為雙向,并且
          set-inverse= "false"并且 在代碼中‘孩子.set父親()’和 父親.add孩子()一定要寫明
          # 如果不希望硬代碼 就 set-inverse="true" 父親.add孩子()’在生成sql 中就會有多余的update
          # 當然根據邏輯情況來選擇


          /**
           * @hibernate.class
           * 
           
          */
          public class Person {
              
          private int id;
              
          private Set<Address> addresss;
              
              
          /**
               * @hibernate.id 
               *   generator-class = "native"
               * 
          @return
               
          */
              
          public int getId() {
                  
          return id;
              }

              
          public void setId(int id) {
                  
          this.id = id;
              }
              
              
          /**
               * @hibernate.set inverse = "false" 
               *     @hibernate.collection-key column ="personId"
               *  @hibernate.collection-one-to-many class = "bean.unidirectional.m2o.Address" 
               
          */
              
          public Set<Address> getAddresss() {
                  
          return addresss;
              }

              
          public void setAddresss(Set<Address> addresss) {
                  
          this.addresss = addresss;
              }


          }




          /**
           * @hibernate.class
           * 
          @author root
           * 
           
          */
          public class Address {
              
          private int id;
              
          private Person person ;
              
              
          /**
               * @hibernate.id generator-class = "native"
               
          */
              
          public int getId() {
                  
          return id;
              }

              
          public void setId(int id) {
                  
          this.id = id;
              }
              
          /**
               * @hibernate.many-to-one 
               *     column = "personId"
               * 
          @return
               
          */
              
          public Person getPerson() {
                  
          return person;
              }

              
          public void setPerson(Person person) {
                  
          this.person = person;
              }
              

          }



              
          public static void main(String[] args) {
                  Session session1 
          = HibernateUtil.currentSession();
                  Transaction t1 
          = session1.beginTransaction();
                  
          //insert
                  Address address1 = new Address();
                  Address address2 
          = new Address();
                  Set
          <Address> addresss = new HashSet<Address>();
                  addresss.add(address1);
                  addresss.add(address2);
                  
                  Person person1 
          = new Person();
                      person1.setAddresss(addresss);
                  
                  address1.setPerson(person1);
                  address2.setPerson(person1);
                  
                  session1.save(person1);        
                  session1.save(address1);
                  session1.save(address2);

                  t1.commit();
                  
                  
          //查詢有重復的 address 
                  Session session2 = HibernateUtil.currentSession();
                  Query query 
          = session2.createQuery(
                          
          "  from "+Person.class.getName()+" tp "
                  );
                  
                  List
          <Person> list =  query.list();
                  
          for(Person ptmp : list ){
                      
          for( Address atmp : ptmp.getAddresss() ){
                          System.out.println(atmp.getId());
                      }
                  }


          結果:干凈的 insert
          Hibernate: insert into Person values ( )
          Hibernate: 
          insert into Address values ( )
          Hibernate: 
          insert into Address values ( )
          Hibernate: 
          select person0_.id as id from Person person0_
          1
          2

          mysql :
          mysql> select * from address ;
          +----+----------+
          | id | personId |
          +----+----------+
          |  1 |        1 |
          |  2 |        1 |
          +----+----------+
          2 rows in set (0.00 sec)


           






          整理 www.aygfsteel.com/Good-Game
          posted on 2008-10-03 16:54 劉凱毅 閱讀(1745) 評論(0)  編輯  收藏 所屬分類: 持久層

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泰州市| 屏东县| 休宁县| 绥芬河市| 亚东县| 张家港市| 罗田县| 开封县| 若羌县| 谢通门县| 盐源县| 通渭县| 伊通| 大新县| 庐江县| 博湖县| 黑水县| 安达市| 论坛| 庄浪县| 通化市| 涪陵区| 新竹县| 隆安县| 中超| 赣州市| 富民县| 舟曲县| 宝清县| 西平县| 都江堰市| 庄浪县| 定边县| 桃园县| 花莲县| 镇康县| 新蔡县| 惠安县| 虹口区| 安宁市| 乐安县|