兩個對象之間是一對一的關係,如Person-IdCard數據庫
有兩種策略能夠實現一對一的關聯映射session
主鍵關聯:即讓兩個對象具備相同的主鍵值,以代表它們之間的一一對應的關係;數據庫表不會有額外的字段來維護它們之間的關係,僅經過表的主鍵來關聯 惟一外鍵關聯app
外鍵關聯,原本是用於多對一的配置,可是若是加上惟一的限制以後,也能夠用來表示一對一關聯關係;ide
一、實體對象測試
1.1 Person實體對象ui
package demo.entity; /** * 人實體 * @author Don * @date:日期:2017年4月11日 時間:上午11:04:59* * @version 1.0 */ public class Person { private String id; private String name; //一對一關係的實體表現 private IdCard card; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IdCard getCard() { return card; } public void setCard(IdCard card) { this.card = card; } }
1.2 IdCard實體對象this
package demo.entity; /** * 身份證明體 * @author Don * @date:日期:2017年4月11日 時間:上午11:05:53* * @version 1.0 */ public class IdCard { private String id; private String code; //一對一關係的實體表現 private Person person; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCode() { return code; } public void setCode(String card) { this.code = card; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
二、一對一關係映射(主鍵關聯)spa
2.1 Person對象映射配置.net
<?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> <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 --> <!-- name:實體, table:表名 --> <class name="demo.entity.Person" table="o2o_person"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator類來生成主鍵 --> <generator class="uuid" /> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <one-to-one name="card" class="demo.entity.IdCard" cascade="all"></one-to-one> </class> </hibernate-mapping>
2.2 IdCard對象映射配置hibernate
<?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> <!-- name:實體, table:表名 --> <class name="demo.entity.IdCard" table="02o_card"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 主鍵關聯,經過Person的主鍵生成IdCard的主鍵--> <generator class="foreign"> <param name="property">person</param> </generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="code" /> <one-to-one name="person" class="demo.entity.Person" cascade="all"></one-to-one> </class> </hibernate-mapping>
三、一對一關係映射(惟一外鍵)
3.1 Person對象映射配置
<?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> <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 --> <!-- name:實體, table:表名 --> <class name="demo.entity.Person" table="o2o_person_forengn"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- Hibernate使用generator類來生成主鍵 --> <generator class="uuid" /> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <!-- card中使用person描述Person對象 --> <one-to-one name="card" property-ref="person" cascade="all"></one-to-one> </class> </hibernate-mapping>
3.2 IdCard對象映射配置
<?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> <!-- name:實體, table:表名 --> <class name="demo.entity.IdCard" table="02o_card_forergn"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 生成主鍵--> <generator class="uuid"></generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="code" /> <!-- IdCard添加外鍵,IdCard和Person具備多對一的關係,實現一對一,則限制unique爲true --> <many-to-one name="person" column="personId" unique="true" cascade="all"></many-to-one> </class> </hibernate-mapping>
四、測試保存
package demo.test; import org.hibernate.classic.Session; import demo.entity.IdCard; import demo.entity.Person; import demo.util.HibernateUtil; public class TestSave { public static void main(String[] args) { Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); Person person = new Person(); person.setName("張三"); //身份證的主鍵Id依賴於Perrson,所以須要添加Person IdCard card = new IdCard(); card.setCode("110"); /* * 保存方式一 * card.setPerson(person); person.setCard(card); session.save(person); */ //方式二(IdCard是關係的維護方) card.setPerson(person); session.save(card); session.getTransaction().commit(); } }