gdufo

           

          實體BEAN的七種關系之---------一對一單向

          http://blog.csdn.net/princetoad/archive/2007/10/10/1817693.aspx
          一對一單向,顧名思義,就是只要求從A方到達B方,而不需要從B方到達A方,典型的例子就是,一個人對應一個地址,因為現實生活中,一個地址可能住很多 人,所以一般我們只需要根據人查到它的地址,而不太會需要從一個地址去查誰住在那里,不過,真的有這種需求的話,我們就要以用另外一種關系來實現了,這個 以后再講

          首先我們聲明一個人的實體類,Person
          /*
           * Person.java
           * 
           * Created on 2007-9-15, 0:11:58
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */


          package lbf.entitybean.test1;

          import java.io.Serializable;
          import java.util.List;
          import javax.persistence.CascadeType;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.OneToMany;
          import javax.persistence.OneToOne;

          /**
           *
           * 
          @author Admin
           
          */

          @Entity
          public class Person implements Serializable {
              
          private static final long serialVersionUID = 1L;
              
          private Long id;
              
          private String name;
              
          private String sex;
              
          private int age;
              
          private Address address;
              
              @OneToOne(cascade
          =CascadeType.ALL,optional=true)
              
          public Address getAddress() {
                  
          return address;
              }


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

              
          public int getAge() {
                  
          return age;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public String getSex() {
                  
          return sex;
              }


              
          public void setSex(String sex) {
                  
          this.sex = sex;
              }

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


              @Id
              @GeneratedValue(strategy 
          = GenerationType.AUTO)
              
          public Long getId() {
                  
          return id;
              }


          }

          再來看看Address的實體BEAN定義
          /*
           * Address.java
           * 
           * Created on 2007-9-15, 0:13:50
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */


          package lbf.entitybean.test1;

          import java.io.Serializable;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;

          /**
           *
           * 
          @author Admin
           
          */

          @Entity
          public class Address implements Serializable {
              
          private static final long serialVersionUID = 1L;
              
          private Long id;
              
          private String country,province,city,street;
              
          private int postcode;
              
          public String getCity() {
                  
          return city;
              }


              
          public void setCity(String city) {
                  
          this.city = city;
              }


              
          public String getCountry() {
                  
          return country;
              }


              
          public void setCountry(String country) {
                  
          this.country = country;
              }


              
          public int getPostcode() {
                  
          return postcode;
              }


              
          public void setPostcode(int postcode) {
                  
          this.postcode = postcode;
              }


              
          public String getStreet() {
                  
          return street;
              }


              
          public void setStreet(String street) {
                  
          this.street = street;
              }

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


              @Id
              @GeneratedValue(strategy 
          = GenerationType.AUTO)
              
          public Long getId() {
                  
          return id;
              }


          }

          以上便是兩個類的定義,從Person里面我們可以看到如下的代碼

          @OneToOne(cascade=CascadeType.ALL,optional=true)
              public Address getAddress() {
                  return address;
              }
          在這里的@OneToOne就是注釋是一對一的關系,其中cascade是表示級聯的關系,是級聯刪除還是級聯更新,還是所有,我們這里選擇的是所有,這 樣的好處就是,我們在插入Person的時候,就順帶的把Person里面包含的Address一起插入數據庫里面,當我們刪除Person的時候,也是 把這個Person對應的Address從數據庫里面刪除,否則就需要我們人工的刪除兩遍或者插入兩遍等等,optional表示這個成員是不是可選的, 我們這里是可選的,也就是說一個人可以沒有地址(比如流浪漢:)).
          然后我們發現,在Address里面只有一些簡單的EntityBean的注釋,并沒有表示關系的注釋,這是因為本例是一對一單向的實現,Person里 面有 Address,而Address卻什么都不知道,它對應到數據庫里面只是一張簡單的表而已,Person對應到數據庫里面就有一個指向 Address的外鍵.我們也可以增加注釋指定外鍵的列的名字,如下:
          @OneToOne(cascade=CascadeType.ALL,optional=true)
          @JoinColumn(name="addressID")
              public Address getAddress() {
                  return address;
              }
          如果我們不加的話,也是可以通過的,在JBOSS里面,它會自動幫你生成你指向這個類的類名加上下劃線再加上id的列,也就是默認列名是:address_id.

          如果是主鍵相關聯的話,那么可以運用如下注釋

          @OneToOne(cascade={CascadeType.ALL})
             @PrimaryKeyJoinColumn

             public Address getAddress( ) {
                return homeAddress;
             }
          它表示兩張表的關聯是根據兩張表的主鍵的

          以下是一些注釋的定義,我們看一下可以了解一下這些注釋有哪些方法,
          public @interface JoinColumn
          {
             String name( ) 
          default "";
             String referencedColumnName( ) 
          default "";
             
          boolean unique( ) default false;
             
          boolean nullable( ) default true;
             
          boolean insertable( ) default true;
             
          boolean updatable( ) default true;
             String columnDefinition( ) 
          default "";
             String table( ) 
          default "";
          }


          public @interface OneToOne
          {
             Class targetEntity( ) 
          default void.class;
             CascadeType[] cascade( ) 
          default {};
             FetchType 
           fetch( ) 
          default EAGER;
             
          boolean optional( ) default true;
             String mappedBy( ) 
          default "";
          }


          public @interface PrimaryKeyJoinColumn
          {
             String name( ) 
          default "";
             String referencedColumnName( ) 
          default "";
             String columnDefinition( ) 
          default "";
          }


          好了,一對一單向差不多就這么些吧,明天再看一下一對一雙向的情況.

          posted on 2008-09-03 11:51 gdufo 閱讀(342) 評論(0)  編輯  收藏 所屬分類: Hibernate

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桂平市| 光山县| 贵溪市| 理塘县| 喀喇沁旗| 疏附县| 湘潭县| 新干县| 呼图壁县| 鹤山市| 陆丰市| 名山县| 东丽区| 菏泽市| 称多县| 蓬安县| 深水埗区| 雷波县| 肥东县| 广元市| 双辽市| 尉氏县| 桓仁| 马关县| 大埔区| 红桥区| 镇平县| 延安市| 西畴县| 晋江市| 务川| 北宁市| 安西县| 全州县| 通山县| 台南市| 砚山县| 南部县| 蕲春县| 阳西县| 阳江市|