還可以用細粒度(fine-grained),也就是一張表映射成多個persistent class,被細化出來的類別,可以用Component把這幾個類別組合起來
相對於細粒度,也有人說一張表映射成一個persistent class是粗粒度
官網的連結在這
※準備資料
drop table chess;
CREATE TABLE CHESS (
CHESS_NO NUMBER(10,0),
NAME VARCHAR2(10 BYTE),
PRICE NUMBER(5,0),
PRODUCT_DATE DATE,
SALARY NUMBER(7,0),
COMPANY VARCHAR2(20 BYTE),
CONSTRAINT "CHESS_PK" PRIMARY KEY ("CHESS_NO")
);
COMMENT ON TABLE CHESS IS '棋表';
COMMENT ON COLUMN CHESS.CHESS_NO IS '編號';
COMMENT ON COLUMN CHESS.NAME IS '名稱';
COMMENT ON COLUMN CHESS.PRICE IS '價錢';
COMMENT ON COLUMN CHESS.PRODUCT_DATE IS '製造日期';
COMMENT ON COLUMN CHESS.SALARY IS '薪水';
COMMENT ON COLUMN CHESS.COMPANY IS '天殺的外派公司名稱';
Insert into CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) values (35,'孔明棋',20,to_date('21-7月 -15','DD-MON-RR'),50000,'小棋玩具社');
INSERT INTO CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) VALUES (7,'象棋',50,to_date('18-7月 -15','DD-MON-RR'),45000,'大毛會社');
Insert into CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) values (8,'西洋棋',120,to_date('18-7月 -15','DD-MON-RR'),30000,'豬超人童玩');
Insert into CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) values (9,'跳棋',30,to_date('18-7月 -15','DD-MON-RR'),15000,'小兔跳棋會社');
INSERT INTO CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) VALUES (10,'圍棋',40,to_date('18-7月 -15','DD-MON-RR'),22000,'大牛圍棋社');
INSERT INTO CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) VALUES (12,'軍棋',99,to_date('18-7月 -15','DD-MON-RR'),17000,'軍啊公司');
Insert into CHESS (CHESS_NO,NAME,PRICE,PRODUCT_DATE,SALARY,COMPANY) values (14,'五子棋',35,to_date('18-7月 -15','DD-MON-RR'),24000,'五子棋協會');
※細粒度就是再進一步的劃分,譬如編號、名稱、價錢、製造日期是屬於產品的基本資訊,還有薪水、外派公司屬於其他資訊,這樣就可以分成三類,也就是資料的更細一步的劃分
※XML設定
Chess.javaprivate Integer chessNo; private ChessBasic xxx; private ChessOther ooo; //setter/getter...
ChessBasic.java
private String name; private Integer price; private Date productDate; //setter/getter...
ChessOther.java
private Integer salary; private String company; //setter/getter...
Chess.hbm.xml
<class name="vo.Chess" table="CHESS"> <id name="chessNo" type="java.lang.Integer"> <column name="CHESS_NO" /> <generator class="assigned" /> </id> <component name="xxx" class="vo.ChessBasic"> <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> </component> <component name="ooo" class="vo.ChessOther"> <property name="salary" type="java.lang.Integer"> <column name="SALARY" /> </property> <property name="company" type="java.lang.String"> <column name="COMPANY" /> </property> </component> </class>
※增加component把屬性包起來而已,name名稱要對應好
Test.java
try {
List<Chess> list = HibernateUtil2.getSession().createQuery("from Chess").list();
for (Chess ch : list) {
System.out.println(ch.getChessNo());
System.out.println(ch.getXxx().getName());
System.out.println(ch.getOoo().getCompany());
}
} catch (Exception e) {
System.err.println("例外錯誤!");
e.printStackTrace();
} finally {
if (s.isOpen()) {
s.close();
}
}
※記得hibernate.cfg.xml的mapping resource要加
※Annotation設定
Chess.java@Entity
@Table(name = "CHESS", schema = "c##scott")
public class Chess {
private Integer chessNo;
private ChessBasic xxx;
private ChessOther ooo;
@Id
@Column(name = "CHESS_NO", unique = true, nullable = false)
public Integer getChessNo() {
return chessNo;
}
public void setChessNo(Integer chessNo) {
this.chessNo = chessNo;
}
//其他setter/getter都不用annotation
}
ChessBasic.java
@Embeddable
@AttributeOverrides({
@AttributeOverride(name = "name", column = @Column(name = "NAME")),
@AttributeOverride(name = "price", column = @Column(name = "PRICE")),
@AttributeOverride(name = "productDate", column = @Column(name = "PRODUCT_DATE"))
})
public class ChessBasic {
private String name;
private Integer price;
private Date productDate;
//setter/getter...且完全不用annotation
}
ChessOther.java
@Embeddable
@AttributeOverrides({
@AttributeOverride(name = "salary", column = @Column(name = "SALARY")),
@AttributeOverride(name = "company", column = @Column(name = "COMPANY"))
})
public class ChessOther {
private Integer salary;
private String company;
//setter/getter...且完全不用annotation
}
※測試類和XML設定一樣
※如果不設@Embeddable,會報「org.hibernate.MappingException: Could not determine type for: vo.ChessBasic, at table: CHESS, for columns: [org.hibernate.mapping.Column(xxx)]」的錯
※如果資料庫和Class name一樣,可以不設@AttributeOverrieds,也就是只有@Embeddable; 這一點和@Column一樣
※@AttributeOverride因為沒有xml,所以在這設定對應關係,Chess.java也不用特別設定什麼,自然就能從getter的回傳類型找到
※如果資料庫和Class name一樣,annotation設定還蠻方便的
沒有留言:
張貼留言