java技術

          hibernate spring struts

          BlogJava 聯系 聚合 管理
            18 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

          一對一(One-To-One)
          使用@OneToOne注解建立實體Bean之間的一對一關聯。一對一關聯有三種情況:(1).關聯的實體都共享同樣的主鍵,(2).其中一個實體通過外鍵關聯到另一個實體的主鍵(注意要模擬一對一關聯必須在外鍵列上添加唯一約束),(3).通過關聯表來保存兩個實體之間的連接關系(要模擬一對一關聯必須在每一個外鍵上添加唯一約束)。
          1.共享主鍵的一對一關聯映射:
          @Entity
          @Table(name="Test_Body")
          public class Body {
             private Integer id;
             private Heart heart;
            
             @Id
             public Integer getId() {
                return id;
             }
            
             public void setId(Integer id) {
                this.id = id;
             }

             @OneToOne
             @PrimaryKeyJoinColumn
             public Heart getHeart() {
                return heart;
             }

             public void setHeart(Heart heart) {
                this.heart = heart;
             }
          }

          @Entity
          @Table(name="Test_Heart")
          public class Heart {
             private Integer id;
             @Id
             public Integer getId() {
                return id;
             }

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

          通過@PrimaryKeyJoinColumn批注定義了一對一關聯

          2.使用外鍵進行實體一對一關聯:
          @Entity
          @Table(name="Test_Trousers")
          public class Trousers {
             @Id
             public Integer id;
             @OneToOne
             @JoinColumn(name = "zip_id")
             public TrousersZip zip;
          }

          @Entity
          @Table(name="Test_TrousersZip")
          public class TrousersZip {
             @Id
             public Integer id;
             @OneToOne(mappedBy = "zip")
             public Trousers trousers;
          }

          上面的例子是指Trousers通過Trousers的外鍵列zip_id和TrousersZip關聯,@JoinColumn批注定義了聯接列,該批注和@Column批注有點類似,但是多了一個名為referencedColumnName的參數。該參數定義了所關聯目標實體中的聯接列,注意,當referencedColumnName關聯到非主鍵列的時候,關聯的目標類必須實現Serializable,還要注意的是所映像的屬性對應單個列(否則映射無效)
          一對一關聯可能是雙向的,在雙向關聯中,有且僅有一端作為主體(owner)端存在:主體端負責維護聯接列(即更新),對于不需要維護這種關系的從表則通過mappedNy屬性進行聲明。mappedBy的值指向主體的關聯屬性。例子中,mappedBy的值為zip。最后,不必也不能再在被關聯端(ownedside)定義聯接列了,因為已經在主體端聲明了。
          如果在主體沒有聲明@JoinColumn,系統自動進行處理:在主表(owner table)中將創建聯接列,列名為:主體的關聯屬性名+下劃線+被關聯端的主鍵列名。上面的例子中是zip_id,因為Trousers中的關聯屬性名為zip,TrousersZip的主鍵是id。

          3.通過關聯表定義一對一關聯
          @Entity
          @Table(name="Test_People")
          public class People {
             @Id
             public Integer id;
             @OneToOne
             @JoinTable(name ="TestPeoplePassports",
               joinColumns = @JoinColumn(name="perple_fk"),
               inverseJoinColumns = @JoinColumn(name="passport_fk")
             )
             public Passport passport;
          }

          @Entity
          @Table(name="Test_Passport")
          public class Passport {
             @Id
             public Integer id;
             @OneToOne(mappedBy = "passport")
             public People people;
          }
          People通過名為TestPeoplePassports的關聯表和Passport關聯。該關聯表擁有名為passport_fk的外鍵列,該外鍵指向Passport表,該信息定義為inverseJoinColoumns的屬性值,而people_fk外鍵列指向People表,該信息定義為joinColumns的屬性值。
          這種關聯可能是雙向的,在雙向關聯中,有且僅有一端作為主體(owner)端存在:主體端負責維護聯接列(即更新),對于不需要維護這種關系的從表則通過mappedNy屬性進行聲明。mappedBy的值指向主體的關聯屬性。例子中,mappedBy的值為passport。最后,不必也不能再在被關聯端(ownedside)定義聯接列了,因為已經在主體端聲明了。

          posted on 2009-11-05 15:32 just 閱讀(2207) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 达尔| 大英县| 商丘市| 广州市| 汝南县| 科尔| 古田县| 潮安县| 石屏县| 临夏市| 理塘县| 宣汉县| 淅川县| 米泉市| 定安县| 赤壁市| 南通市| 宁河县| 新龙县| 陆丰市| 将乐县| 凯里市| 姜堰市| 蒲江县| 固镇县| 天镇县| 纳雍县| 虎林市| 双峰县| 怀仁县| 老河口市| 崇州市| 甘孜| 通化县| 慈利县| 张家界市| 保山市| 万源市| 惠东县| 彭州市| 长沙市|