天天看點

Hibernate關系映射級别注解(多對一單向外鍵關聯)

多對一單向外鍵關聯

所謂多對一,就說多方持有一方的引用,比如:多個學生對應一個班級

在多方需要添加如下注解:

@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();
    }
}
           

繼續閱讀