但這兩個table有各自的primary key,
我們可以考慮在供應商的table裡面,
增加一個外鍵欄位來連結銀行帳戶,
參考以下的供應商(Supply)和銀行帳戶(BankAccount)的關聯圖,
由於是雙向關聯,
在Supply物件裡會參考至BankAccount物件,
而在BankAccount物件裡也會參考Supply物件,
Supply.java
package com.model; public class Supply { private String code; private String name; private BankAccount bAccount; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BankAccount getbAccount() { return bAccount; } public void setbAccount(BankAccount bAccount) { this.bAccount = bAccount; } }
BankAccount.java
package com.model; public class BankAccount { private String accountNumber; private String bankName; private Supply supply; public String getAccountNumber() { return accountNumber; } public void setAccountNumber(String accountNumber) { this.accountNumber = accountNumber; } public String getBankName() { return bankName; } public void setBankName(String bankName) { this.bankName = bankName; } public Supply getSupply() { return supply; } public void setSupply(Supply supply) { this.supply = supply; } }
在使用外鍵來完成一對一關聯,
即是在多對一的關係中,
限制多的一方只能有一個去對應到一的一方,
可參考以下的配置,
Supply.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.model.Supply" table="supply"> <id name="code" type="java.lang.String"> <generator class="assigned" /> </id> <property name="name" type="string"> <column name="name" length="20" not-null="true" /> </property> <many-to-one name="bAccount" class="com.model.BankAccount" cascade="all" outer-join="true" unique="true"> <column name="accountNumber" /> </many-to-one> </class> </hibernate-mapping>
在many-to-one的配置中,
我們使用了unique="true"來限制必須為一對一關聯,
cascade="all"表示所有情況下皆進行關聯(save、update、delete),
outer-join="true"表示使用一條SQL查詢並join關聯table,
另外在BankAccount.hbm.xml中使用one-to-one來完成雙向一對一關係,
BankAccount.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.model.BankAccount" table="bankaccount"> <id name="accountNumber" type="java.lang.String"> <generator class="assigned" /> </id> <property name="bankName" type="string"> <column name="bankName" length="20" not-null="true" /> </property> <one-to-one name="supply" property-ref="bAccount" class="com.model.Supply" /> </class> </hibernate-mapping>
在one-to-one中使用property-ref來指定參照到supply裡面的bAccount,
參考測試程式:
TestSupplyBank.java
package com.hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import com.hibernate.util.HibernateUtils; import com.model.BankAccount; import com.model.Supply; public class TestSupplyBank { public static void main(String[] args) { Session session = HibernateUtils.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); try { Supply aSupply=new Supply(); BankAccount bankAccount=new BankAccount(); aSupply.setCode("WDR12345"); aSupply.setName("ABC公司"); bankAccount.setAccountNumber("1652-2323-1212-1232"); bankAccount.setBankName("大大銀行"); aSupply.setbAccount(bankAccount); bankAccount.setSupply(aSupply); session.save(aSupply); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { session.close(); HibernateUtils.shutdown(); } } }
執行結果如下:
Hibernate: select bankaccoun_.accountNumber, bankaccoun_.bankName as bankName3_ from bankaccount bankaccoun_ where bankaccoun_.accountNumber=?
Hibernate: insert into bankaccount (bankName, accountNumber) values (?, ?)
Hibernate: insert into supply (name, accountNumber, code) values (?, ?, ?)
第一條select是由於這是創一個新的物件,
hibernate在緩存中也找不到,
為了確認這個關聯物件是可以插入到DB裡的,
所以先進行一次select尋找,
可看到table的資料如下:
table supply
table bankaccount
沒有留言:
張貼留言