blogjava's web log

          blogjava's web log
          ...

          hibernate一對一例子-已更新(一)

          先看由滿江紅翻譯團隊(RedSaga Translate Team)翻譯的一對一配置說明
          一對一

          持久化對象之間一對一的關聯關系是通過one-to-one元素定義的。

          <one-to-one
                  name="propertyName"                                          (1)
                  class="ClassName"                                            (2)
                  cascade="cascade_style"                                      (3)
                  constrained="true|false"                                     (4)
                  fetch="join|select"                                          (5)
                  property-ref="propertyNameFromAssociatedClass"               (6)
                  access="field|property|ClassName"                            (7)
                  formula="any SQL expression"                                 (8)
                  lazy="true|proxy|false"                                      (9)
                  entity-name="EntityName"                                     (10)
                  node="element-name|@attribute-name|element/@attribute|."
                  embed-xml="true|false"
          />
          (1)

          name: 屬性的名字。

          (2)

          class (可選 - 默認是通過反射得到的屬性類型):被關聯的類的名字。

          (3)

          cascade(級聯) (可選) 表明操作是否從父對象級聯到被關聯的對象。

          (4)

          constrained(約束) (可選) 表明該類對應的表對應的數據庫表,和被關聯的對象所對應的數據庫表之間,通過一個外鍵引用對主鍵進行約束。 這個選項影響save()delete()在級聯執行時的先后順序以及 決定該關聯能否被委托(也在schema export tool中被使用).

          (5)

          fetch (可選 - 默認設置為選擇): 在外連接抓取或者序列選擇抓取選擇其一.

          (6)

          property-ref: (可選) 指定關聯類的屬性名,這個屬性將會和本類的主鍵相對應。如果沒有指定,會使用對方關聯類的主鍵。

          (7)

          access (可選 - 默認是 property): Hibernate用來訪問屬性的策略。

          (8)

          formula (可選):絕大多數一對一的關聯都指向其實體的主鍵。在一些少見的情況中, 你可能會指向其他的一個或多個字段,或者是一個表達式,這些情況下,你可以用一個SQL公式來表示。 (可以在org.hibernate.test.onetooneformula找到例子)

          (9)

          lazy (可選 - 默認為 proxy): 默認情況下,單點關聯是經過代理的。lazy="true"指定此屬性應該在實例變量第一次被訪問時應該延遲抓?。╢etche lazily)(需要運行時字節碼的增強)。 lazy="false"指定此關聯總是被預先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate會采取預先抓取!

          (10)

          entity-name (可選): 被關聯的類的實體名。

          具體配置可以看
          http://www.huihoo.com/framework/hibernate/reference-v3_zh-cn/mapping.html
          好。。再來測試。。。
          1.建表
          create ? table ?student
          (sid?
          varchar ( 32 )? not ? null ? primary ? key ,
          ?sname?
          varchar ( 16 ),
          ?sage?
          varchar ( 16 )
          )
          create ? table ?address
          (aid?
          varchar ( 32 )? not ? null ? primary ? key ,
          acity?
          varchar ( 16 ),
          aroad?
          varchar ( 16 )
          )
          2.寫VO
          ?? Address vo
          package?com.test;

          public?class?Address
          {
          ????
          private?String?aid;
          ????
          private?String?acity;
          ????
          private?String?aroad;
          ????
          private?Student?student;
          ??
          //寫上GET?SET方法
          Student vo
          package?com.test;
          public?class?Student
          {
          ????
          private?String?sid;
          ????
          private?String?sname;
          ????
          private?String?sage;
          ????
          private?Address?address;
          //寫上get?set

          3.寫配置文件
          Student.hbm.xml
          <?xml?version="1.0"?>
          <!DOCTYPE?hibernate-mapping
          ????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD//EN"
          ????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
          >

          <hibernate-mapping>

          ????
          <class?name="com.test.Student"?table="student"?>

          ????????
          <id?name="sid"?type="string"?unsaved-value="null"?>
          ????????????
          <column?name="sid"?sql-type="char(32)"?not-null="true"/>
          ????????????
          <generator?class="uuid.hex"/>
          ????????
          </id>

          ????????
          <property?name="sname">
          ????????????
          <column?name="sname"?sql-type="varchar(16)"?/>
          ????????
          </property>

          ????????
          <property?name="sage">
          ????????????
          <column?name="sage"?sql-type="varchar(16)"?/>
          ????????
          </property>

          ????????
          <one-to-one?name="address"?class="com.test.Address"?cascade="all"/>?
          ???
          ????
          </class>

          </hibernate-mapping>
          Address.hbm.xml
          <?xml?version="1.0"?>
          <!DOCTYPE?hibernate-mapping
          ????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD//EN"
          ????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
          >

          <hibernate-mapping>

          ????
          <class?name="com.test.Address"?table="address"?>

          ????????
          <id?name="aid"?type="string"?unsaved-value="null"?>
          ????????????
          <column?name="aid"?sql-type="char(32)"?not-null="true"/>
          ????????????
          <generator?class="foreign">
          ????????????????
          <param?name="property">student</param>
          ????????????
          </generator>
          ????????
          </id>

          ????????
          <property?name="acity">
          ????????????
          <column?name="acity"?sql-type="varchar(16)"?/>
          ????????
          </property>

          ????????
          <property?name="aroad">
          ????????????
          <column?name="aroad"?sql-type="varchar(16)"?/>
          ????????
          </property>

          ????????
          <one-to-one?name="student"?class="com.test.Student"/>

          ????
          </class>

          </hibernate-mapping>

          接著把下面的hibernate.properties文件拷到classes目錄下。。這里用的是mysql
          hibernate.query.substitutions?true?1,?false?0,?yes?'Y',?no?'N'
          ##?MySQL
          hibernate.dialect?net.sf.hibernate.dialect.MySQLDialect
          hibernate.connection.driver_class?org.gjt.mm.mysql.Driver
          hibernate.connection.url?jdbc:mysql://localhost:3306/wjcms
          hibernate.connection.username?root
          hibernate.connection.password?wujun
          hibernate.connection.pool_size?1
          hibernate.proxool.pool_alias?pool1
          hibernate.show_sql?true
          hibernate.jdbc.batch_size?0
          hibernate.max_fetch_depth?1
          hibernate.cache.use_query_cache?true?
          4.寫測試類了..

          package?com.test;

          import?net.sf.hibernate.Session;
          import?net.sf.hibernate.SessionFactory;
          import?net.sf.hibernate.cfg.Configuration;
          import?net.sf.hibernate.*;
          import?java.sql.*;
          import?java.util.List;

          public?class?TestOneToOne
          {
          ????SessionFactory?sf;
          ????Session?session;
          ????
          public?TestOneToOne()
          ????
          {
          ????????
          try
          ????????
          {
          ????????????Configuration?cfg?
          =?new?Configuration();
          ????????????sf?
          =?cfg.addClass(Student.class).addClass(Address.class).buildSessionFactory();
          ????????}

          ????????
          catch(HibernateException?ex)
          ????????
          {
          ????????????ex.printStackTrace();
          ????????}

          ????}

          ????
          public?void?doCreate()
          ????
          {
          ????????
          try
          ????????
          {
          ????????????session?
          =?sf.openSession();

          ????????????Student?student?
          =?new?Student();
          ????????????student.setSname(
          "小王");
          ????????????student.setSage(
          "22");

          ????????????Address?address?
          =?new?Address();
          ????????????address.setAcity(
          "深圳");
          ????????????address.setAroad(
          "深南");
          ????????????address.setStudent(student);
          ????????????student.setAddress(address);

          ????????????session.save(student);
          ????????????session.flush();
          ????????????session.connection().commit();

          ????????}

          ????????
          catch(HibernateException?ex)
          ????????
          {
          ????????????ex.printStackTrace();
          ????????}

          ????????
          catch(SQLException?ex1)
          ????????
          {
          ????????????ex1.printStackTrace();
          ????????}

          ????????
          finally
          ????????
          {
          ????????????????
          try{
          ????????????????????session.close();
          ????????????????}

          ????????????????
          catch(HibernateException?ex2){
          ????????????????}

          ????????}


          ????}

          ????
          public?void?doQuery()
          ????
          {
          ????????
          try{
          ????????????session?
          =?sf.openSession();
          ????????????Query?q?
          =?session.createQuery("select?s?from?Student?as?s");
          ????????????List?l?
          =?q.list();
          ????????????Student?s?
          =?null;
          ????????????Address?address?
          =?null;
          ????????????
          for(int?i=0;i<l.size();i++)
          ????????????
          {
          ????????????????s?
          =?(Student)l.get(i);
          ????????????????System.out.println(
          "姓名:?"+s.getSname());
          ????????????????System.out.println(
          "年齡:?"+s.getSage());
          ????????????????address?
          =?s.getAddress();
          ????????????????System.out.println(
          "住址:??"+address.getAcity()+address.getAroad());
          ????????????}


          ????????}

          ????????
          catch(HibernateException?ex){
          ????????????ex.printStackTrace();
          ????????}

          ????????
          finally{
          ????????????
          try{
          ????????????????session.close();
          ????????????}

          ????????????
          catch(HibernateException?ex2){
          ????????????}

          ????????}

          ????}

          ????
          public?static?void?main(String[]?args)
          ????
          {
          ????????TestOneToOne?t?
          =?new?TestOneToOne();
          ????????
          //t.doCreate();
          ????????t.doQuery();
          ????}

          }

          posted on 2006-04-06 16:05 record java and net 閱讀(6057) 評論(3)  編輯  收藏 所屬分類: java

          評論

          # re: hibernate一對一例子-方便以后查看(一) 2006-04-13 11:45 foreverjiang

          <one-to-one name="address" class="com.test.Address" cascade="all"/>

          <one-to-one name="student" class="com.test.Student"/>

          這里的2個一對一都對應什么,只要定義一對一的字段,無需定義別的嗎  回復  更多評論   

          # re: hibernate一對一例子-已更新(一) 2006-04-22 09:50 吳某人-不斷地學習

          是的。。

            回復  更多評論   

          # re: hibernate一對一例子-已更新(一) 2008-04-29 10:52 xx

          寫一個級聯刪除的例子吧。
          搞不定  回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 万源市| 许昌县| 鲁甸县| 龙胜| 淮阳县| 湖口县| 甘孜县| 武宁县| 于田县| 南雄市| 平凉市| 迁西县| 宁城县| 黔东| 阜新市| 福建省| 南汇区| 宜兰市| 北海市| 大新县| 乐清市| 河津市| 聂拉木县| 蓬安县| 太谷县| 大渡口区| 根河市| 柳江县| 高邑县| 抚远县| 兰考县| 勐海县| 都安| 阿巴嘎旗| 昌邑市| 龙海市| 新宁县| 镇远县| 萨迦县| 九龙坡区| 马龙县|