多對一單向外鍵關聯
所謂多對一,就說多方持有一方的引用,比如:多個學生對應一個班級
在多方需要添加如下注解:
@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
兩個常用屬性,cascade依然指定級聯關系,fetch指的是抓取政策,一般預設EAGER,表示積極的渴望的
@JoinColumn(name=”cid”,referencedColumnName=”COD”)
name是一方的外鍵,referencedColumnName表示對應的外鍵如果映射成資料庫表裡的内容可以起的名稱
建立一個包,将學生類拷貝,這次不需要身份證類。把Students類中和IdCard類有關的内容删掉。
然後建一個班級實體類ClassRoom,既然是實體類,是以需要@Entity注解。
@Entity
public class ClassRoom {
@Id
@GeneratedValue(generator="cid")
@GenericGenerator(name="cid",strategy="assigned")
@Column(length=)
private String cid;//班級号
private String cname;//班級名
public ClassRoom(){
}
public ClassRoom(String cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
在Students類中要加上ClassRoom,并封裝,在get方法上加上對應注解。另外還要添加一個姓名的屬性。
@Entity
public class Students {
private int sid;
private String sname;
private String gender;
private Date birthday;
private String major;
private ClassRoom classRoom;
public Students(){
}
public Students(String sname, String gender, Date birthday,
String major) {
//super();
//這裡不傳入sid,因為是自動增長的,不需要指派
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
}
@Id
@GeneratedValue
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
@JoinColumn(name="cid",referencedColumnName="CID")
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
}
這樣兩個實體類就建好了,在配置文檔中将兩個注解類配置進去。
<mapping class="mto_fk.Students"/>
<mapping class="mto_fk.ClassRoom"/>
在測試類中值保留建立表的測試方法,依然有效。然後寫一下添加記錄的方法:
public class TestStudents {
@Test
public void testSchemaExport() {
// 建立配置對象
Configuration config = new Configuration().configure();
// 建立服務注冊對象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(config.getProperties()).buildServiceRegistry();
// 建立會話工廠對象
SessionFactory sessionFactory = config
.buildSessionFactory(serviceRegistry);
SchemaExport export = new SchemaExport(config);
export.create(true, true);
}
@Test
public void addStudents() {
// 建立配置對象
Configuration config = new Configuration().configure();
// 建立服務注冊對象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(config.getProperties()).buildServiceRegistry();
// 建立會話工廠對象
SessionFactory sessionFactory = config
.buildSessionFactory(serviceRegistry);
//建立會話對象
Session session = sessionFactory.getCurrentSession();
//建立事務對象
Transaction tx = session.beginTransaction();
//先建立班級對象
ClassRoom c1 = new ClassRoom("C001","計算機科學");
ClassRoom c2 = new ClassRoom("C002","物聯網工程");
//然後建立四個學生對象
Students s1 = new Students("張三", "男", new Date(), "計算機");
Students s2 = new Students("李四", "女", new Date(), "計算機");
Students s3 = new Students("王五", "女", new Date(), "計算機");
Students s4 = new Students("趙六", "男", new Date(), "計算機");
s1.setClassRoom(c1);
s2.setClassRoom(c1);
s3.setClassRoom(c2);
s4.setClassRoom(c2);
//先儲存班級
session.save(c1);
session.save(c2);
//再儲存學生
session.save(s1);
session.save(s2);
session.save(s3);
session.save(s4);
tx.commit();
}
}