JavaMuse

          對象的存儲和關(guān)系型數(shù)據(jù)庫

          ORM 的原則是將一個類映射到一張表上,然而對象和關(guān)系型數(shù)據(jù)庫之間有一點的差異。
          對象和對象之間的關(guān)系有一對一,一對多,多對多。這三個關(guān)系的關(guān)系的存儲是有差異的。
          1、一對一:我們可以用兩張表分別表示兩個類。他們之間的關(guān)系我們可以用主關(guān)鍵字或者外關(guān)鍵字來表示。然而這里有一個粒度的問題(The problem of granularity )。關(guān)于粒度問題見第4點。
          2、一對多:我們也可以用兩張表來表示兩個類。他們的關(guān)系我們可以用外鍵來關(guān)聯(lián)。
          3、多對多:我們可以用兩張表來表示這兩個類。用第三張表來表示他們之間的關(guān)系。
          4、關(guān)于問題的粒度:
          ??????如:一個用戶和一個地址之間的關(guān)系。當(dāng)然我們可以用一對一的方法來解決。
          然而這樣是否合理?也許最好的方法是在數(shù)據(jù)庫中增加一個新的數(shù)據(jù)類型Address(country state city zipcode etc.)。這樣我們就很容易把這個粒度問題解決了。不幸的是,數(shù)據(jù)庫是不允許自定義類型的(也許現(xiàn)在的數(shù)據(jù)庫可以,鄙人不太清楚,呵呵)。Hibernate 對這個問題有了很好的解決。見以后的文章。
          5、對象之間可以有繼承的關(guān)系,這是數(shù)據(jù)庫望洋興嘆的。Hibernate 對這個問題有了很好的解決。見以后的文章。
          6、對象的身份識別問題。
          ??? 大家都知道,java中的對象識別是用equals()和haseCode()來實現(xiàn)。
          ???舉例:

          package ?jmuse.eg;
          /**
          ?*@hibernate.class?table="MESSAGE"
          ?*
          ?
          */


          public ? class ?Message? {
          ????
          private ?Long?id;
          ????
          private ?String?text;
          ????
          private ?String?string;
          ????
          public ? void ?setString(String?s) {
          ????????string
          = s;
          ????}

          ????
          /**
          ?????*@hibernate.property?
          ?????*
          ?????
          */

          ?????
          public ?String?getString() {
          ????????
          return ? this .string;
          ????}

          ????
          ????
          private ?Message?nextMessage;
          ????
          public ?Message()? {}
          ????
          public ?Message(String?text) {
          ????????
          this .text = text;
          ????}

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


          ????
          public ? void ?setText(String?text)? {
          ????????
          this .text? = ?text;?
          ????}


          ????
          public ? void ?setNextMessage(Message?nextMessage)? {
          ????????
          this .nextMessage? = ?nextMessage;?
          ????}

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

          ????
          public ?Long?getId()? {
          ????????
          return ?( this .id);?
          ????}

          ????
          /**
          ?????*@hibernate.property?column="MESSAGE_TEXT"
          ?????*
          ?????
          */

          ????
          public ?String?getText()? {
          ????????
          return ?( this .text);?
          ????}

          ????
          /**
          ?????*@hibernate.many-to-one?column="NEXT_MESSAGE_ID"?cascade="all"
          ?????*
          ?????
          */

          ????
          public ?Message?getNextMessage()? {
          ????????
          return ?( this .nextMessage);?
          ????}

          }

          這樣的類由于沒有實現(xiàn)equals()和haseCode(),所以如果用下面的代碼我們可以看到如下輸出:

          Message?m1 = new ?Message("Hello");
          Message?m2
          = new ?Message("Hello");
          if (!(m2.equals(m1)) )log.info( " m1?and?m2?are?not?idential " );
          else ?log.info( " m1?and?m2?are?identical " );

          ////////////// /out?put //////////////
          m1?and?m2?are?not?idential

          但是我們加上如下代碼:

          ? public ? boolean ?equals(Object?o) {
          ????????
          if ( this == o)? return ? true ;
          ????????
          if ( ! (o? instanceof ?Message))?
          ????????????????
          return ? false ;
          ????????
          final ?Message?m = (Message)o;
          ????????
          return ? this .getText().equals(m.getText());
          ????}

          ????
          public ? int ?hashCode() {
          ????????
          // return?text==null?System.identityHashCode(this):text.hashCode();
          ???????? int ?hase = 20 ;
          ????????
          ????????
          return ? 20 * hase + getText().hashCode();
          ????}


          //////////// out?put //////////// /
          m1?and?m2?are?identical

          這就是java的對象識別。如果你將修改后的Message對象加入到j(luò)ava.util.Set中,不管你加多少,最后size()仍然為1。
          ?那么hibernate中的對象識別如何呢?見以后文章。呵呵。

          ?

          posted on 2007-02-10 14:44 滿山紅葉 閱讀(653) 評論(0)  編輯  收藏 所屬分類: Hibernate學(xué)習(xí)筆記


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 乐昌市| 彰化县| 邻水| 西青区| 定边县| 高尔夫| 页游| 宜宾县| 大宁县| 宜黄县| 阿巴嘎旗| 敦化市| 吉隆县| 清水河县| 南充市| 定结县| 雷州市| 文山县| 云南省| 阿克陶县| 静乐县| 香河县| 尼勒克县| 惠来县| 钟山县| 砀山县| 万载县| 班戈县| 永平县| 龙井市| 揭西县| 金门县| 乳源| 永胜县| 丰台区| 定南县| 周至县| 康马县| 措勤县| 武功县| 靖州|