many-to-many
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多
<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置
新建学生
private int sid;
private String sname;.
新建老师
private int tid;
private String tname;
新建Stud.hbm.xml文件
<class name="com.tfsoft.manytomany.Stud" table="stud">
<id name="sid">
<generator></generator>
</id>
<property name="sname" length="20"></property>
<set name="teacs" table="st"><!-- 中间表名称 -->
<key column="s_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->
<many-to-many column="t_id" class="com.tfsoft.manytomany.Teac"></many-to-many>
<!-- 老师主键在中间表中的字段名称 -->
</set>
</class>
新建Teac.hbm.xml文件
<class name="com.tfsoft.manytomany.Teac" table="teac">
<id name="tid">
<generator></generator>
</id>
<property name="tname" length="20"></property>
<set name="studs" table="st"><!-- 中间表名称 -->
<key column="t_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->
<many-to-many column="s_id" class="com.tfsoft.manytomany.Stud"></many-to-many>
</set>
</class>
新建测试类
public class Many {
private static Configuration cf = null;
private static SessionFactory sf = null;
static{
cf = new Configuration().configure();
sf = cf.buildSessionFactory();
}
//新增老师
public void saveOrUpdateTeac(Teac teac){
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.saveOrUpdate(teac);
ts.commit();
session.close();
}
//修改老师
public void saveOrUpdateTeac(int tid){
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Teac teac = (Teac)session.get(Teac.class, tid);
Set studs = teac.getStuds();
studs.add(getStudById(1));
teac.setStuds(studs);
session.saveOrUpdate(teac);
ts.commit();
session.close();
}
//拿老师对象
public Teac getTeacById(int tid){
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Teac teac = (Teac)session.get(Teac.class, tid);
ts.commit();
session.close();
return teac;
}
//新增学生
public void saveOrUpdateStud(Stud stud){
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.saveOrUpdate(stud);
ts.commit();
session.close();
}
//拿学生对象
public Stud getStudById(int sid){
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Stud stud = (Stud)session.get(Stud.class, sid);
ts.commit();
session.close();
return stud;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Many m = new Many();
/* Teac t = new Teac(); 新增老师
t.setTname("老师A");
m.saveOrUpdateTeac(t);
Stud s = new Stud(); 新增学生
s.setSname("学生A");
m.saveOrUpdateStud(s);*/
/* Teac t = m.getTeacById(1); 通过Id获取老师对象
Set studs = new HashSet(); 新建集合
Stud stud = m.getStudById(2); 通过Id获取学生
studs.add(stud); 将获取的学生放入集合
t.setStuds(studs); 将集合放入学生类
m.saveOrUpdateTeac(t);*/ 执行方法
m.saveOrUpdateTeac(1);
}
}
多对多转换成一对多使用
新建学生
private int sid;
private String sname;
//中间表集合
private Set sts = new HashSet();
新建老师
private int tid;
private String tname;
private Set sts = new HashSet();
新建中间表
private int id;
private Teac teac;
private Stud stud;
新建Stud.hbm.xml
<class name="com.tfsoft.manytomany2.Stud" table="stud">
<id name="sid">
<generator></generator>
</id>
<property name="sname" length="20"></property>
<set name="sts" inverse="true">
<key column="s_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->
<one-to-many class="com.tfsoft.manytomany2.St"/>
</set>
</class>
新建Teac.hbm.xml
<class name="com.tfsoft.manytomany2.Teac" table="teac">
<id name="tid">
<generator></generator>
</id>
<property name="tname" length="20"></property>
<set name="sts" inverse="true">
<key column="t_id" not-null="true"></key><!-- 学生主键在中间表中的字段名称 -->
<one-to-many class="com.tfsoft.manytomany2.St"/>
</set>
</class>
新建St.hbm.xml
<class name="com.tfsoft.manytomany2.St" table="st">
<id name="id">
<generator></generator>
</id>
<many-to-one name="teac" class="com.tfsoft.manytomany2.Teac" column="t_id" not-null="true">
</many-to-one>
<many-to-one name="stud" class="com.tfsoft.manytomany2.Stud">
<column name="s_id" not-null="true"></column>
</many-to-one>
</class>
测试类
public class Many {
private static Configuration cf = null;
private static SessionFactory sf = null;
static {
cf = new Configuration().configure();
sf = cf.buildSessionFactory();
}
// 新增老师
public void saveOrUpdateTeac(Teac teac) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.saveOrUpdate(teac);
ts.commit();
session.close();
}
// 拿老师对象
public Teac getTeacById(int tid) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Teac teac = (Teac) session.get(Teac.class, tid);
ts.commit();
session.close();
return teac;
}
// 新增学生
public void saveOrUpdateStud(Stud stud) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.saveOrUpdate(stud);
ts.commit();
session.close();
}
// 拿学生对象
public Stud getStudById(int sid) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Stud stud = (Stud) session.get(Stud.class, sid);
ts.commit();
session.close();
return stud;
}
// 新增中间表
public void saveOrUpdateSt(St st) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.saveOrUpdate(st);
ts.commit();
session.close();
}
// 通过两个外键取一个对象
public St getStById(int sid, int tid) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Query query = session.createQuery("from St where stud.sid=" + sid
+ " and teac.tid=" + tid);
List list = query.list();
St st = (St) list.get(0);
ts.commit();
session.close();
return st;
}
// 删除老师
public void deleteTeac(Teac teac) {
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
session.delete(teac);
ts.commit();
session.close();
}
public static void main(String[] args) {
Many m = new Many();
/* St st = new St();
Teac t = m.getTeacById(1); //获取老师
Stud s =m.getStudById(2); //获取学生
st.setStud(s); 放到中间表
st.setTeac(t);
m.saveOrUpdateSt(st);*/ 新增
/* St st = m.getStById(2, 1); 修改中间表,通过Id获取对象
Teac t = m.getTeacById(2); 通过Id获取老师对象
st.setTeac(t); 将老师添加到中间表中
m.saveOrUpdateSt(st);*/ 修改
m.deleteTeac(m.getTeacById(2)); 通过Id获取老师,再删除
}
}