<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 簡介 一個對象就對應著表中的一條記錄,而表中的字段對應著類中的屬性。 數據庫中表與表之間存在著三種關系,也就是系統設計中的三種實體關系 ## 一對一 原則有兩種: 1. 唯一外鍵對應:在任意一方添加外鍵來描述對應關系 2. 主鍵對應:一方的主鍵作為另一方的主鍵 ~~~ Class Employee { Private Archives archives; } Class Archives { Private Employee employee; } ~~~ ## 一對多,多對一 客戶與訂單之間一對多關系(多對一) 建表原則:在多的一方添加外鍵來描述關聯關系 ~~~ Class Customer { Private Set<Order> orders; } Class Order { Private Customer c; } ~~~ ## 多對多 例如學生與老師 建表原則:通過一張中間表來描述其對應關系 中間表分別指向多方的主鍵 ~~~ Class Student{ Set<Teacher> ts; } Class Teacher{ Set<Student> ss; } ~~~ # Hibernate關系映射--(一對多,多對一) 類創建 訂單 ~~~ //訂單---多的一方 public class Order { private Integer id; private Double money; private String receiverInfo; //收貨地址 //訂單與客戶關聯 private Customer c; //描述訂單屬于某一個客戶 } ~~~ 客戶 ~~~ public class Customer { private Integer id; //主鍵 private String name; //姓名 //描述客戶可以有多個訂單 private Set<Order> orders = new HashSet<Order>(); } ~~~ 映射文件編寫 Order.hbm.xml ~~~ <!-- 多對一 --> <many-to-one name="c" class="cn.jdxia.one ToMany.Customer" column="c_customer_id"> </many-to-one> <!-- name屬性它描述的是 Order類中的一的一方的屬性名稱 Customer c; class代表一的一方的類型 column描述的是一對多,在多的一方產生的外鍵的名稱 c_customer_id --> ~~~ Customer.hbm.xml ~~~ <!-- 一個客戶關聯多個訂單 --> <set name="orders"> <key column="c customer id"/> <one-to-many class="cn.jdxia.oneToManyOrder" /> </set> <!-- 使用set來描述在一的一方中關聯的多Set<Order>,它的name屬性就是set集合的名稱 key:它主要描述關聯的多的一方產生的外鍵名稱,注意要與多的一方定義的外鍵名稱相同 one-to-many描述集合中的類型 --> ~~~ ## 測試保存 ~~~ //2.3 建立關系 //2.3.1 訂單關聯客戶 o1.setC(c); o2.setC(c); //2.3.2客戶關聯訂單 c.getOrders().add(o1); c.getOrders().add(o2); session.save(o1); session.save(o2); session.save(c); ~~~ 上面操作是一種雙向關聯 問題:我們可不可以只保存訂單或只保存客戶完成保存操作? ## 測試單向關聯保存 ~~~ //2.3建立關系 //2.3.1訂單關聯客戶 o1.setC(c); o2.setC(c); session.save(o1); //o1是一個持久化對象 session.save(o2); //o2是一個持久化對象 ~~~ ~~~ org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing ~~~ 這個異常代表提一個持久化對象關聯了一個瞬時對象。 我們可以使用級聯操作來解決上述的問題. **我們現在要做的是保存訂單時保存客戶,需要在訂單的hbm配置文件中修改** ~~~ <!-- 多對一 --> <!-- name屬性:因為在聯系人實體類使用customer對象表示,寫customer名稱c class屬性: customer全路徑 column屬性: 外鍵名稱 --> <many-to-one name="c" class="cn.jdxia.oneToMany.Customer" column="c_customer_ id" cascade="save-update"></many-to-one> ~~~ **設置`cascade= save-update`那么在保存訂單時就可以自動將客戶保存, 把客戶放到訂單里面就可以** 如果要加上級聯刪除就這樣 ~~~ <many-to-one name="c" class="cn.jdxia.oneToMany.Customer" column="c_customer_ id" cascade="save-update,delete"></many-to-one> ~~~ 如果我們要完成保存客戶時,保存訂單 ~~~ <!-- 一個客戶關聯多個訂單 --> <set name="orders" cascade="save-update"> <key column="c_customer_id"/> <one-to-many class="cn.jdxia.oneToMany.Order"/> </set> ~~~ ## 雙向關聯維護 我們在開發中要配置雙向關聯配置---------可以通過任意一方來操作對方 在操作代碼,盡量來要進行單向關聯------可以盡量資源浪費。 **在雙向關聯中,會存在多余的update語句 ** 我們可以使用inverse屬性來設置,雙向關聯時由哪一方來維護表與表之間的關系。 一般一的一方,放棄 ~~~ <!--一個客戶關聯多個訂單 <set name="orders" inverse="true"> <key column="c_customer_id" /> <one-to-many class="cn.jdxia.oneToMany.Order" /> </set> ~~~ inverse為true,代表對方維護主鍵 inverse為false,由自己維護主鍵,默認 關于inverse取值: 外鍵在哪個表中,我們就讓一方維護外鍵 # 級聯刪除 我們在刪除客戶時,也要刪除訂單,如果沒有做級聯,那么這個操作是不允許。 為了維護數據完整性 ~~~ //操作-刪除訂單時,不需要刪除客戶,當我們刪除一個客戶時,應該將客戶對應訂單也刪除 Customer c = session.get(Customer.class, 1); session.delete(c); //刪除客戶,訂單是否刪除 ~~~ 想要完成操作:我們可以在客戶中添加`cascade="delete";` ~~~ <!-- 一個客戶關聯多個訂單 --> <set name="orders" inverse="true" cascade="delete"> <key column="c_customer_id" /> <one-to-many class="cn.jdxia.oneToMany.Order" /> </set> ~~~ **delete-orphan用法** ~~~ //2. 操作 //得到客戶 Customer c = session.get(Customer class, 2); //得到客戶的訂單 Order o = session. get(Order.class, 6); c.getOrders(). remove(o); ~~~ ~~~ <!-- 一個客戶關聯多個訂單 --> <set name="orders" inverse=true" cascade="delete-orphan"> <key column="c_customer_id" /> <one-to-many class="cn.jdxia.oneToMany.Order" /> </set> ~~~ # cascade總結 使用cascade可以完成級聯操作 它可常用取值: none這是一個默認值 `save-update`,當我們配置它時,底層使用`save update`或`save-update`完成操作,級聯保存臨時對象,如果是游離對象,會執行update. delete 級聯刪除 delete-ophan 刪除與當前對象解除關系的對象。 all 它包含了`save-update delete`操作 `all-delete-orphan` 它包信了delete-orphan與all操作 # cascade與inverse有什么區別? ~~~ cascade它是完成級聯操作 Inverse它只有在雙向關聯情況下有作用,它來指定由哪一方維護外鍵 ~~~ # 多對多 我們使用注解完成多對多配置. 描述學生與老師. 使用@ManyToMany來配置多對多,只需要在一端配置中間表,另一端使用mappedBy表示放置外鍵維護權。 創建PO類 Teacher類中 ~~~ @Entity @Table(name ="t_teacher") public class Teacher { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private string name; @ManyToMany(targetEntity = Student.class, mappedBy=" teachers") //代表由對方來維護外鍵 private Set<Student> students = new HashSet<Student>(); } ~~~ Student類中 ~~~ @Table(name ="t_student") public class Student { @GeneratedValue (strategy = GenerationType.IDENTITY) private Integer id; private String name; @ManyToMany(targetEntity = Teacher.class) //使用JoinTabl來貓述中間表,并描述中間表中外鍵與Student,Teacher的映射關系 //joinColumns它是用來描述Student與中間表中的映射關系 //inverseJoinColums它是用來描述Teacher與中間表中的映射關系 @JoinTable(name="s_t", joinColumns = { @JoinColumn(name = "c_student_id") }, inverseJoinColumns = { @JoinColumn(name ="c_teacher_id")}) private Set<Teacher> teachers = new HashSet<Teacher>(); } ~~~ --- 如果是xml的話 ~~~ <!-- 在用戶里面表示所有角色,使用set標簽 name屬性: 角色set集合名稱 table屬性: 第三張表名詞 --> <set name="setRole" table="user_role"> <!-- key標簽里面配置,當前映射文件在第三張表外鍵名稱 --> <key column="userid"></key> <!-- class:角色實體類全路徑, column: 角色在第三張表外鍵名稱 --> <many-to-many class="cn.jdxia.manytomany.Role" column="roleid"></many-to-many> </set> ~~~ ## 級聯保存操作測試 因為我們將外鍵的維護權利由Student來維護,我們演示保存學生時,將都也級聯保存。 ~~~ //學生關聯老師 s1.getTeachers().add(t1); s1.getTeachers().add(t2); s2.getTeachers().add(t1); s2.getTeachers().add(t2); //保存學生 session.save(s1); session.save(s2); ~~~ 在Student類中配置了級聯 ~~~ @JoinTable(name="s_t", joinColumns = { @JoinColumn(name = "c_student_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "c_teacher_id", referencedColumnName = "id") }) @Cascade(CascadeType.SAVE_UPDATE) private Set<Teacher> teachers = new HashSet<Teacher>(); ~~~ # 一對一 以人與身份證號為例 一對一操作有兩種映射方式: 1. 1. 在任意一方添加外鍵 2. 2. 主鍵映射 ## 外鍵映射 創建實體 User類 ~~~ @Entity @Table(name = "t_user") public class User { @Id @GenericGenerator(strategy = "uuid", name = "myuuid") @GeneratedValue(generator = "myuuid") private String id; private String name; @OneToOne(targetEntity = IDCard.class, mappedBy = "user") private IDCard idCard; } ~~~ 上述配置,t\_user表放棄對外鍵的維護權利 IDCard類 ~~~ @Entity @Table(name = "t_idcard") public class IDCard { @Id @GenericGenerator(strategy = "uuid", name = "myuuid") @GeneratedValue(generator = "myuuid") private String id; private String cardNum; @OneToOne(targetEntity = User.class) @JoinColumn(name = "c_user_id") @Cascade(CascadeType.SAVE_UPDATE) private User user; } ~~~ joinColumn指定外鍵列名稱,當前配置外鍵是在t_idcard表中 ~~~ //創建一個人 User user = new User(); user.setName("abc"); //創建身份證號 IDCard idcard = new IDCard(); idcard.setCardNum("12345"); //身份證關聯人 idcard.setUser(user); //存儲身份證號 session.save(idcard); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看