一对多 多对一 外键双向关联
一个皇帝对应多个大臣如下:
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。