一对多 多对一 外键双向关联

一个皇帝对应多个大臣如下:

emperor_info did(int 4 pk )  name(varchar)

minister_info  mid(int 4 pk)  name(varchar)  did(int int 4 fk) 

 

实体:

package bi.one2many;
 
import java.util.HashSet;
import java.util.Set;
 
public class Emperor {
    private int id;
    private String name;
    private Set<Minister> ministers = new HashSet<Minister>();
 
    public Emperor() {
 
    }
 
    public Emperor(int id, String name, Set<Minister> ministers) {
        super();
        this.id = id;
        this.name = name;
        this.ministers = ministers;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Set<Minister> getMinisters() {
        return ministers;
    }
 
    public void setMinisters(Set<Minister> ministers) {
        this.ministers = ministers;
    }
 
}
 
package bi.one2many;
 
public class Minister {
    private int id;
    private String name;
    private Emperor emperor;
 
    public Minister() {
 
    }
 
    public Minister(int id, String name, Emperor emperor) {
        super();
        this.id = id;
        this.name = name;
        this.emperor = emperor;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Emperor getEmperor() {
        return emperor;
    }
 
    public void setEmperor(Emperor emperor) {
        this.emperor = emperor;
    }
 
}

  

hbm配置文件:

<hibernate-mapping>
    <class name="bi.one2many.Emperor">
        <id name="id" column="did">
            <generator class="native" />
        </id>
        <property name="name" type="string" column="name"></property>
         
        <!-- confirure the uniredirection association -->
        <set name="ministers" inverse="true" cascade="all">
            <key column="did" not-null="true"></key>
            <one-to-many class="bi.one2many.Minister"/>
        </set>
    </class>
 
</hibernate-mapping>
<hibernate-mapping>
    <class name="bi.one2many.Minister">
        <id name="id" column="mid">
            <generator class="native" />
        </id>
        <property name="name" type="string" column="name"></property>
        <many-to-one name="emperor" column="did" cascade="all"></many-to-one>
    </class>
 
</hibernate-mapping>

  

测试文件:

public class Test {
     
    @org.junit.Test
    public void testAdd() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.getCurrentSession();
        session.beginTransaction();
         
        Minister m1 = new Minister();
        m1.setName("廉颇");
         
        Minister m2 = new Minister();
        m2.setName("蔺相如");
         
        Emperor emperor = new Emperor();
        emperor.setName("齐威王");
        //emperor.getMinisters().add(m1);
        //session.save(emperor);
         
        m1.setEmperor(emperor);
        m2.setEmperor(emperor);
         
        session.save(m1);
        session.save(m2);
        session.beginTransaction().commit();
    }
}

  

测试结果:

Hibernate: insert into Emperor (name) values (?)
Hibernate: insert into Minister (name, did) values (?, ?)
Hibernate: insert into Minister (name, did) values (?, ?)

  

在双向关联关系配置中有inverse属性和cascade属性比较让人迷糊,不过参看一下这个文章写得蛮清楚的: 

Hibernate中的Inverse和cascade属性配置

http://www.cnblogs.com/focusj/archive/2011/03/23/2057603.html

posted @ 2012-09-11 11:03  haiwei.sun  阅读(169)  评论(0编辑  收藏  举报
返回顶部