※準備工作
DROP TABLE CAR_ATTR PURGE;
DROP TABLE CAR PURGE;
CREATE TABLE CAR_ATTR (
CAID NUMBER(5,0),
COLOR VARCHAR2(20),
CC NUMBER(3,0),
CONSTRAINT CAR_ATTR_PK PRIMARY KEY(CAID)
);
CREATE TABLE CAR (
CID NUMBER(5,0),
NAME VARCHAR2(20),
CAR_ATTR_CAID NUMBER(5,0),
CONSTRAINT CAR_PK PRIMARY KEY(CID),
CONSTRAINT CAR_FK FOREIGN KEY(CAR_ATTR_CAID) REFERENCES CAR_ATTR(CAID) ON DELETE CASCADE
);
CREATE SEQUENCE CAR_SEQ;
CREATE SEQUENCE CAR_ATTR_SEQ;
※XML設定
Car.hbm.xml
<class name="vo.Car" table="CAR"> <id name="cid" type="java.lang.Integer"> <column name="CID" /> <generator class="sequence"> <param name="sequence">CAR_SEQ</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <many-to-one name="carAttr" class="vo.CarAttr" unique="true" column="CAR_ATTR_CAID" cascade="all" lazy="false" fetch="select" /> </class>
※many-to-one且unique="true"就是一對一了,主要在這裡設定和資料庫欄位的對應
CarAttr.hbm.xml
<class name="vo.CarAttr" table="CAR_ATTR"> <id name="caid" type="java.lang.Integer"> <column name="CAID" /> <generator class="sequence"> <param name="sequence">CAR_ATTR_SEQ</param> </generator> </id> <property name="color" type="java.lang.String"> <column name="COLOR" /> </property> <property name="cc" type="java.lang.Integer"> <column name="CC" /> </property> </class>
Car.java
public class Car {
private Integer cid;
private String name;
private CarAttr carAttr;
// setter/getter...
}
CarAttr.java
public class CarAttr {
private Integer caid;
private String color;
private Integer cc;
// setter/getter...
}
新增測試
CarAttr ca = new CarAttr();
// ca.setCaid(3350); // 如果不是sequence就在這塞PK
ca.setColor("藍4");
ca.setCc(540);
Car c = new Car();
c.setName("寶石傑4");
c.setCarAttr(ca);
s.save(c);
tx.commit();
※只要存Car就都會存起來了
修改測試
CarAttr ca = new CarAttr();
ca.setCaid(141); // 實務上須自行去資料庫撈出來
ca.setColor("藍5");
ca.setCc(550);
Car c = new Car();
c.setCid(121); // 實務上須自行去資料庫撈出來
c.setName("寶石傑5");
c.setCarAttr(ca);
s.update(c);
tx.commit();
※修改和刪除一樣,都一定要塞CarAttr的PK
查詢測試
Car car = (Car) s.get(Car.class, 122); s.close(); System.out.println(car.getName()); System.out.println(car.getCarAttr().getColor());
※預設fetch是select,改成join是有用的
刪除測試
Car c = new Car(); c.setCid(123); CarAttr ca = new CarAttr(); ca.setCaid(143); c.setCarAttr(ca); s.delete(c); tx.commit();
※修改和刪除一樣,都一定要塞CarAttr的PK
※Annotation設定
Car.java
@Entity
@Table
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OOO")
@SequenceGenerator(name = "OOO", sequenceName = "CAR_SEQ")
private Integer cid;
private String name;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "CAR_ATTR_CAID", unique = true)
@LazyToOne(value = LazyToOneOption.FALSE)
private CarAttr carAttr;
//setter/getter...
}
CarAttr.java
@Entity
@Table(name = "CAR_ATTR")
public class CarAttr {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX")
@SequenceGenerator(name = "XXX", sequenceName = "CAR_ATTR_SEQ")
private Integer caid;
private String color;
private Integer cc;
//setter/getter...
}
※增刪改查的測試只有一個地方不同,就是查詢時,預設不是select,是join,FetchType.LAZY和FetchType.EAGER當然也是有用的
沒有留言:
張貼留言