2014年1月9日 星期四

單向一對一(主鍵關聯) XML Mapping

在hibernate的一對一配置中,

如果你採用的是如下的主鍵關聯方式,











可看到人和車的一對一關聯設定,

並且採用的是同一主鍵關聯對應,

Person.java
package com.model;

public class Person {
 private String id;
 private String name;
 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;
 }
 
}

Car.java
package com.model;

public class Car {
 private String userId;
 private String licenseNum;
 private Person person;
 public String getUserId() {
  return userId;
 }
 public void setUserId(String userId) {
  this.userId = userId;
 }
 public String getLicenseNum() {
  return licenseNum;
 }
 public void setLicenseNum(String licenseNum) {
  this.licenseNum = licenseNum;
 }
 public Person getPerson() {
  return person;
 }
 public void setPerson(Person person) {
  this.person = person;
 }
}

Person.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.Person" table="person">
  <id name="id" type="java.lang.String">
   <generator class="assigned" />
  </id>
  <property name="name" type="string">
   <column name="name" length="10" not-null="true" />
  </property>
 </class>
</hibernate-mapping>

Car.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.Car" table="car">
  <id name="userId" column="userId">
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
  </id>
  <property name="licenseNum" type="string">
   <column name="licenseNum" length="10" not-null="true" />
  </property>
  <one-to-one name="person" constrained="true"/>
 </class>
</hibernate-mapping>

Car.hbm.xml中 的id映射,

需設定為外鍵關聯且參數名稱為person,

並且在一對一配置上將constrained設定為true,

表示限制為一對一關聯。

接下來我們撰寫測試程式如下:

TestPersonCar.java
package com.hibernate;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.util.HibernateUtils;
import com.model.Car;
import com.model.Person;

public class TestPersonCar {

 public static void main(String[] args) {

  Session session = HibernateUtils.getSessionFactory().openSession();
  Transaction tx = session.beginTransaction();
  try {
   Person person = new Person();
   person.setId("W123456789");
   person.setName("Jeff");

   Car car = new Car();
   car.setLicenseNum("WTR-928");
   car.setPerson(person);

   session.save(car);
   session.save(person);
   tx.commit();
  } catch (Exception e) {
   tx.rollback();
   e.printStackTrace();
  } finally {
   session.close();
   HibernateUtils.shutdown();
  }
 }

}

此為執行完成時的console畫面,
Hibernate: insert into car (licenseNum, userId) values (?, ?)
Hibernate: insert into person (name, id) values (?, ?)


table person













table car


沒有留言:

張貼留言