<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Hiberate 一對一映射注解示例 > 原文: [https://howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/](https://howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/) 如果您正在處理任何 Hiberate 項目,或者計劃將來進行任何處理,那么您可以輕松了解應用中多個實體之間的一對一關系。 在此 Hibernate 一對一映射示例中,我們將討論 Hibernate 支持的此映射的 3 種不同變體。 ```java Table fo contents Various supported techniques for one to one mapping 1\. Using foreign key association 2\. Using common join table 3\. Using shared primary key ``` 對于此 Hiberate 一對一映射示例,我擴展了為 [Hiberate HelloWorld 示例](//howtodoinjava.com/hibernate/hibernate-3-introduction-and-writing-hello-world-application/ "Hibernate 3 introduction and writing HelloWorld application")編寫的示例。 這里有兩個實體:`Employee`和`Account`。 一名員工可以擁有一個帳戶。 同樣,一個帳戶將僅與一個員工關聯。 在此示例中,這是一對一的關系。 ## 各種支持的技術 在 Hiberate 下,有 3 種方法可在兩個實體之間創建一對一關系。 無論哪種方式,我們都必須使用[**`@OneToOne`**](https://docs.oracle.com/javaee/5/api/javax/persistence/OneToOne.html "one to one annotation")注解。 1. 第一種技術使用最廣泛,并且在其中一個表中使用**外鍵列**。 2. 第二種技術使用一種眾所周知的解決方案,即具有**第三張表**來存儲前兩個表之間的映射。 3. 第三種技術是新技術,它在兩個表中都使用了**公共主鍵值**。 ## 1\. 使用外鍵關聯的 Hiberate 一對一映射 在這種關聯中,在**所有者實體**中創建了一個外鍵列。 例如,如果我們使為`EmployeeEntity`為所有者,則將在`Employee`表中創建一個額外的列`"ACCOUNT_ID"`。 此列將存儲`Account`表的外鍵。 表結構將如下所示: ![foreign key association one to one](https://img.kancloud.cn/dd/e9/dde99b1c4e224702b862bb4c1c34f73c_430x182.png "foreign key association one to one") 要進行這種關聯,請按如下所示引用`EmployeeEntity`類中的`Account`實體: ```java @OneToOne @JoinColumn(name="ACCOUNT_ID") private AccountEntity account; ``` 連接列用[**`@JoinColumn`**](https://docs.oracle.com/javaee/5/api/javax/persistence/JoinColumn.html "Join Column annotation")注解聲明,看起來像 [**`@Column`**](https://docs.oracle.com/javaee/5/api/javax/persistence/Column.html "Column annotation") 注解。 它還有一個名為`referencedColumnName`的參數。 此參數在目標實體中聲明將用于連接的列。 如果在所有者方未聲明`@JoinColumn`,則使用默認值。 將在所有者表中創建一個連接列,其名稱將是所有者端關系名稱`_`(下劃線)和所擁有的主鍵列名稱的連接。 側。 在雙向關系中,一方(只有一方)必須是所有者。 所有者負責關聯列的更新。 *為了聲明對關系不負責的一方,使用了`mappedBy`屬性*。[“`mappedBy`”是指所有者一方的關聯的屬性名稱。](https://docs.oracle.com/javaee/5/api/javax/persistence/OneToOne.html#mappedBy%28%29 "mappedBy") ```java @OneToOne(mappedBy="account") private EmployeeEntity employee; ``` 在“`mappedBy`”屬性上方,它聲明依賴于所有者實體進行映射。 讓我們在運行的代碼中測試上述映射: ```java public class TestForeignKeyAssociation { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); AccountEntity account = new AccountEntity(); account.setAccountNumber("123-345-65454"); // Add new Employee object EmployeeEntity emp = new EmployeeEntity(); emp.setEmail("demo-user@mail.com"); emp.setFirstName("demo"); emp.setLastName("user"); // Save Account session.saveOrUpdate(account); // Save Employee emp.setAccount(account); session.saveOrUpdate(emp); session.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 運行以上代碼可在數據庫中創建所需的架構,然后運行這些 SQL 查詢。 ```java Hibernate: insert into ACCOUNT (ACC_NUMBER) values (?) Hibernate: insert into Employee (ACCOUNT_ID, EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?, ?) ``` 當您運行上述程序時,可以在兩個表中驗證數據和映射。 ## 2\. 使用公共連接表的 Hiberate 一對一映射 這種方法對我們所有人都不陌生。 讓我們從這種技術的目標 DB 結構開始。 ![join table one to one mapping](https://img.kancloud.cn/59/a7/59a72395297067223b57e68b2ced1e14_592x160.png "join table one to one mapping") 在該技術中,要使用的主要注解是[**`@JoinTable`**](https://docs.oracle.com/javaee/5/api/javax/persistence/JoinTable.html "Join table annotation")。 **此注解用于定義兩個表**中的新表名(強制性)和外鍵。 讓我們看看它的用法: ```java @OneToOne(cascade = CascadeType.ALL) @JoinTable(name="EMPLOYEE_ACCCOUNT", joinColumns = @JoinColumn(name="EMPLOYEE_ID"), inverseJoinColumns = @JoinColumn(name="ACCOUNT_ID")) private AccountEntity account; ``` `@JoinTable`注解在`EmployeeEntity`類中使用。 它聲明將使用兩列`EMPLOYEE_ID`(`EMPLOYEE`表的主鍵)和`ACCOUNT_ID`(`ACCOUNT`表的主鍵)創建一個新表`EMPLOYEE_ACCOUNT`。 測試以上實體會在日志文件中生成以下 SQL 查詢: ```java Hibernate: insert into ACCOUNT (ACC_NUMBER) values (?) Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?) Hibernate: insert into EMPLOYEE_ACCCOUNT (ACCOUNT_ID, EMPLOYEE_ID) values (?, ?) ``` ## 3\. 使用共享主鍵的 Hiberate 一對一映射 在這種技術中,Hiberate 將確保在兩個表中都使用一個公共的主鍵值。 這樣,`EmployeeEntity`的主鍵也可以安全地假定為`AccountEntity`的主鍵。 表結構將如下所示: ![shared primary key one to one](https://img.kancloud.cn/45/62/456272b5bf3e6d9ff6dba17e468fcdf4_364x160.png "shared primary key one to one") 在這種方法中,[**`@PrimaryKeyJoinColumn`**](https://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html "PrimaryKeyJoinColumn annotation")是要使用的主要注解。 讓我們看看如何使用它。 ```java @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private AccountEntity account; ``` 在`AccountEntity`端,它將仍然依賴于所有者實體進行映射。 ```java @OneToOne(mappedBy="account", cascade=CascadeType.ALL) private EmployeeEntity employee; ``` 測試以上實體會在日志文件中生成以下 SQL 查詢: ```java Hibernate: insert into ACCOUNT (ACC_NUMBER) values (?) Hibernate: insert into Employee (ACCOUNT_ID, EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?, ?) ``` 因此,我們已經看到所有 **3 種不同的方式來創建 Hiberate 中支持的一對一映射**。 我建議您下載源代碼并使用它。 學習愉快! [下載源碼](https://drive.google.com/file/d/0B7yo2HclmjI4VHJnQk4tYjBueDA/view?usp=drive_web "hibernate one to one mapping tutorial source code")
                  <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>

                              哎呀哎呀视频在线观看