※table per class hierarchy
※準備資料
DROP TABLE CHESS; CREATE TABLE CHESS ( ID NUMBER(5), NAME VARCHAR(10), PRICE NUMBER(5), PRODUCT_DATE DATE, SCORE NUMBER(3), SCHOOL VARCHAR(20), SALARY NUMBER(6), COMPANY VARCHAR(20), JUDGE VARCHAR(1), CONSTRAINT PK_CHESS PRIMARY KEY(ID) );
※將所有的欄位全部放在一張表,然後多新增一個判斷的欄位,以上例就是JUDGE
如果是S,那SALARY和COMPANY就不使用;
如果是M,那SCORE和SCHOOL就不使用
※XML設定
Chess.java
public abstract class Chess {
private Integer id;
private String name;
private Integer price;
private Date productDate;
//setter/getter...
}
Maker.java
public class Maker extends Chess {
private Integer salary;
private String company;
//setter/getter...
}
Student.java
public class Student extends Chess {
private Integer score;
private String school;
//setter/getter...
}
Chess.hbm.xml
<class name="vo.Chess" abstract="true"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="assigned" /> </id> <discriminator column="JUDGE" type="string" /> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="price" type="java.lang.Integer"> <column name="PRICE" /> </property> <property name="productDate" type="java.util.Date"> <column name="PRODUCT_DATE" /> </property> <subclass name="vo.Student" discriminator-value="S"> <property name="score" type="java.lang.Integer"> <column name="SCORE" /> </property> <property name="school" type="java.lang.String"> <column name="SCHOOL" /> </property> </subclass> <subclass name="vo.Maker" discriminator-value="M"> <property name="salary" type="java.lang.Integer"> <column name="SALARY" /> </property> <property name="company" type="java.lang.String"> <column name="COMPANY" /> </property> </subclass> </class>
※注意discriminator和subclass的discriminiator-value,順序也要注意
測試類
Session s = HibernateUtil2.getSession();
Transaction tx = s.beginTransaction();
try {
System.out.println("-----測試學生-----");
Student stu = new Student();
stu.setId(1);
stu.setName("象棋");
stu.setPrice(50);
stu.setProductDate(new Date(100, 0, 1));
stu.setScore(78);
stu.setSchool("家裡蹲大學");
s.save(stu);
System.out.println("-----測試員工-----");
Maker mak = new Maker();
mak.setId(2);
mak.setName("五子棋");
mak.setPrice(30);
mak.setProductDate(new Date(102, 11, 12));
mak.setSalary(43000);
mak.setCompany("少林寺管委會");
s.save(mak);
tx.commit();
Student stuRtn = (Student) s.get(Student.class, 1);
System.out.println("學校名:" + stuRtn.getSchool());
Maker makRtn = (Maker) s.get(Maker.class, 2);
System.out.println("公司名:" + makRtn.getCompany());
} catch (Exception e) {
System.err.println("例外錯誤!");
e.printStackTrace();
tx.rollback();
tx.rollback();
} finally {
if (s.isOpen()) {
s.close();
}
}
※控制台的訊息,會自動將JUDGE塞值
※Annotation設定
hibernate.cfg.xml
<mapping class="vo.Chess" /> <mapping class="vo.Student" /> <mapping class="vo.Maker" />
Chess.java
@DiscriminatorColumn(name="JUDGE", discriminatorType = DiscriminatorType.STRING)
@Entity
@Table(name = "CHESS")
public abstract class Chess {
private Integer id;
private String name;
private Integer price;
private Date productDate;
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Column(name = "PRODUCT_DATE")
public Date getProductDate() {
return productDate;
}
public void setProductDate(Date productDate) {
this.productDate = productDate;
}
}
Maker.java
@DiscriminatorValue("M")
@Entity
public class Maker extends Chess {
//...
}
Student.java
@DiscriminatorValue("S")
@Entity
public class Student extends Chess {
//...
}
沒有留言:
張貼留言