※準備工作
DROP TABLE STUDENT PURGE; DROP TABLE CLAZZ PURGE; CREATE TABLE CLAZZ( CID NUMBER(5), CNAME VARCHAR(15), CONSTRAINT CLAZZ_PK PRIMARY KEY(CID) ); CREATE TABLE STUDENT( SID NUMBER(5), SNAME VARCHAR(15), CLAZZ_ID NUMBER(5), CONSTRAINT STUDENT_PK PRIMARY KEY(SID), CONSTRAINT STUDENT_FK FOREIGN KEY(CLAZZ_ID) REFERENCES CLAZZ(CID) ON DELETE CASCADE ); CREATE SEQUENCE CLAZZ_SEQ; CREATE SEQUENCE STUDENT_SEQ;
※和一對多雙向FK關聯一模一樣
※XML設定
Clazz.hbm.xml
<class name="vo.Clazz" table="CLAZZ"> <id name="cid" type="java.lang.Integer"> <column name="CID" /> <generator class="sequence"> <param name="sequence">CLAZZ_SEQ</param> </generator> </id> <property name="cname" type="java.lang.String"> <column name="CNAME" /> </property> </class>
※因為是多對一單向,這裡是一,所以不用特別設定
Student.hbm.xml
<class name="vo.Student" table="STUDENT"> <id name="sid" type="java.lang.Integer"> <column name="SID" /> <generator class="sequence"> <param name="sequence">STUDENT_SEQ</param> </generator> </id> <property name="sname" type="string"> <column name="SNAME" /> </property> <many-to-one name="clazz" column="CLAZZ_ID" not-null="true" lazy="false" cascade="all"/> </class>
※因為是多對一單向,這裡是多,所以要設定
Clazz.java
public class Clazz {
private Integer cid;
private String cname;
// setter/getter...
}
※因為是多對一單向,這裡是一,所以不用特別設定
Student.java
public class Student {
private Integer sid;
private String sname;
private Clazz clazz;
// setter/getter...
}
※因為是多對一單向,這裡是多,所以要設定
新增測試
Clazz clazz = new Clazz();
clazz.setCname("一年壬班");
for (int i = 1; i <= 2; i++) {
Student stu = new Student();
stu.setSname("小" + i + "班");
stu.setClazz(clazz);
s.save(stu);
}
tx.commit();
修改測試
Clazz clazz = new Clazz();
clazz.setCid(47);
clazz.setCname("三年丙班");
String sql = " SELECT * FROM STUDENT WHERE CLAZZ_ID = :id ";
SQLQuery query = s.createSQLQuery(sql)
.addScalar("SID", StandardBasicTypes.INTEGER)
.addScalar("SNAME", StandardBasicTypes.STRING);
query.setParameter("id", clazz.getCid());
@SuppressWarnings("unchecked")
List<Object> list = query.list();
for (int i = 0; i < list.size(); i++) {
Object[] o = (Object[]) list.get(i);
Student stu = new Student();
stu.setSid((Integer) o[0]);
stu.setSname("中" + i + "班");
stu.setClazz(clazz);
s.update(stu);
}
tx.commit();
查詢多方(Student)測試
Student stu = (Student) s.get(Student.class, 90); s.close(); System.out.println(stu.getSname()); System.out.println(stu.getClazz().getCname());
※還是要設定lazy="false",否則Clazz(一方)會查不到
※預設fetch是select
刪除多方(Student)測試
Student stu = (Student) s.get(Student.class, 90); s.delete(stu); tx.commit();
※只要刪除多方,就會幫我們刪除一方了
※Annotation設定
Clazz.java
@Entity
@Table
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX")
@SequenceGenerator(name = "XXX", sequenceName = "CLAZZ_SEQ")
private Integer cid;
@Column
private String cname;
// setter/getter...
}
Student.java
@Entity
@Table
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "OOO")
@SequenceGenerator(name = "OOO", sequenceName = "STUDENT_SEQ")
private Integer sid;
@Column
private String sname;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "CLAZZ_ID")
@LazyToOne(value = LazyToOneOption.FALSE)
private Clazz clazz;
// setter/getter...
}
※測試的結果和XML設定相比較,只有查詢略有不同
XML預設是select; Annotation預設是FetchType.EAGER(join)
沒有留言:
張貼留言