天天看點

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

一對多單向外鍵關聯

一對多就是一方持有多方的集合,一個班級有多個學生

需要在一方添加注解:

@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)

抓取政策一般采用的是懶加載

@JoinColumn(name=”cid”)

用來表示對應的外鍵的名稱

總結:多對一是,多方設定EAGER,一方設定LAZY

在前一個例子中,把Students類中的ClassRoom删掉,在ClassRoom(一方)中持有Students(多方)的集合。可以寫為

private Set<Students> stus;

,然後将字段封裝。在屬性上方加上注解。

@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
    @JoinColumn(name="cid")
    private Set<Students> stus;
           

這樣配置就完成了。

然後在配置檔案裡配置一下兩個類。

測試類在之前的例子中修改,建立資料表的方法不變。在添加記錄的方法中,因為是一對多,一方持有多方的集合,是以在先建立好了班級和學生對象之後,先建立兩個集合。儲存的時候順序反過來,先儲存學生,再儲存班級。

@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(), "計算機");

        //建立兩個集合對象
        Set<Students> set1 = new HashSet<Students>();
        set1.add(s1);
        set1.add(s2);
        Set<Students> set2 = new HashSet<Students>();
        set1.add(s3);
        set1.add(s4);

        c1.setStus(set1);
        c2.setStus(set2);

        //先儲存學生
        session.save(s1);
        session.save(s2);
        session.save(s3);
        session.save(s4);
        //再儲存班級
        session.save(c1);
        session.save(c2);

        tx.commit();
    }
           

一對多(多對一)雙向外鍵關聯

多方:多方持有一方的引用

配置的注解有:

@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)

@JoinColumn(name=”cid”)

一方:一方持有多方的集合

配置的注解有:

@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)

@JoinColumn(name=”cid”)

在前一個例子中,一方已經添加了多方的集合,隻需要在多方添加一方的引用。

private ClassRoom classRoom;

,然後對字段進行封裝。在get方法上加上注解。

@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinColumn(name="cid")
    public ClassRoom getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(ClassRoom classRoom) {
        this.classRoom = classRoom;
    }
           

修改配置文檔

<mapping class="otm_bfk.Students"/>
    <mapping class="otm_bfk.ClassRoom"/>
           

在測試類中,由于是雙向的,是以無論先儲存學生還是先儲存班級都是可以的,是以之前的測試方法不需要修改。直接執行可以建立表和添加記錄。

繼續閱讀