JiveJdon Community Forums
在线274人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » 开源项目大家谈
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 2 回复 / 1
 发表新帖子   回复该主题贴
zhanghaidang

悄悄话
发表文章: 5
注册时间: 2007年04月16日 14:36
关于Hibernate多对多拆分为多个一对多的问题. 2007年05月14日 21:57 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表
关于Hibernate多对多拆分为多个一对多的问题.
开发环境为:MyEclipse5.1
数据库:
create table student
(
sid int(8) not null auto_increment,
sname varchar(30) not null default '',
primary key(sid)
)engine=innodb default charset=gbk;

create table teacher
(
tid int(8) not null auto_increment,
tname varchar(30) not null default '',
primary key(tid)
)engine=innodb default charset=gbk;

create table student_teacher_link
(
id int(8) not null auto_increment,
sid int(8),
tid int(8),
primary key(id),
foreign key(sid) references student(sid),
foreign key(tid) references teacher(tid)
)engine=innodb default charset=gbk;

然后通过MyEclipse自动生成功能,生成以下hbm.xml和POJO类文件
#学生类
public class Student{
private Integer sid;
private String sname;
private Set studentTeacherLinks = new HashSet(0);

public Student() {}

public Student(String sname) {
this.sname = sname;
}

public Student(String sname, Set studentTeacherLinks) {
this.sname = sname;
this.studentTeacherLinks = studentTeacherLinks;
}

/*一系列set/get方法*/
}
#老师类
public class Teacher{
private Integer tid;
private String tname;
private Set studentTeacherLinks = new HashSet(0);
public Teacher() {}
public Teacher(String tname) {
this.tname = tname;
}

public Teacher(String tname, Set studentTeacherLinks) {
this.tname = tname;
this.studentTeacherLinks = studentTeacherLinks;
}
/*一系列set/get方法*/
}
#主键关联类
public class StudentTeacherLink{
private Integer id;
private Teacher teacher;
private Student student;

public StudentTeacherLink() {}
public StudentTeacherLink(Teacher teacher, Student student) {
this.teacher = teacher;
this.student = student;
}
/*一系列set/get方法*/
}

zhanghaidang

悄悄话
发表文章: 5
注册时间: 2007年04月16日 14:36
re:关于Hibernate多对多拆分为多个一对多的问题. 2007年05月14日 21:57 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
三个映射文件
#Studnet.hbm.xml
<class name="com.hibernate.pojo.Student" table="student">
<id name="sid" type="java.lang.Integer">
<column name="sid" />
<generator class="native" />
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="30" not-null="true" />
</property>
<set name="studentTeacherLinks" inverse="true" lazy="true">
<key>
<column name="sid" unique="true" />
</key>
<one-to-many class="com.hibernate.pojo.StudentTeacherLink" />
</set>
</class>

#Teacher.hbm.xml
<class name="com.hibernate.pojo.Teacher" table="teacher">
<id name="tid" type="java.lang.Integer">
<column name="tid" />
<generator class="native" />
</id>
<property name="tname" type="java.lang.String">
<column name="tname" length="30" not-null="true" />
</property>
<set name="studentTeacherLinks" inverse="true" lazy="true">
<key>
<column name="tid" unique="true" />
</key>
<one-to-many class="com.hibernate.pojo.StudentTeacherLink" />
</set>
</class>

#StudentTeacherLink.hbm.xml
<class name="com.hibernate.pojo.StudentTeacherLink" table="student_teacher_link">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<many-to-one name="teacher" class="com.hibernate.pojo.Teacher" cascade="save-update">
<column name="tid" unique="true" />
</many-to-one>
<many-to-one name="student" class="com.hibernate.pojo.Student" cascade="save-update">
<column name="sid" unique="true" />
</many-to-one>
</class>

测试类
public class UtilDAO {
public static void saveStudent(){
//两个学生,两个老师
Student stu1 = new Student("亚当");
Student stu2 = new Student("夏娃");
Teacher tea1 = new Teacher("张老师");
Teacher tea2 = new Teacher("李老师");
//相互关联
StudentTeacherLink st1 = new StudentTeacherLink(tea1,stu1);
StudentTeacherLink st2 = new StudentTeacherLink(tea1,stu2);
StudentTeacherLink st3 = new StudentTeacherLink(tea2,stu1);
StudentTeacherLink st4 = new StudentTeacherLink(tea2,stu2);

Session session = null;
Transaction tr = null;
try{
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
//保存数据
session.saveOrUpdate(st1);
session.saveOrUpdate(st2);
session.saveOrUpdate(st3);
session.saveOrUpdate(st4);
tr.commit();
}catch(Exception e){
e.printStackTrace();
tr.rollback();
}finally{
session.close();
}
}

public static void printStudent(){
Session session = null;
Transaction tr = null;

try{
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
//查找老师ID为1的老师
Query query = session.createQuery("from Teacher t where t.tid=1");
//取得老师对象
Teacher ter = (Teacher)query.uniqueResult();
//???这里我不知道该不该这样获取学生集合
Set set = ter.getStudentTeacherLinks();
Iterator it = set.iterator();
while(it.hasNext()){
//***在这里取出学生对象时,发生异常了(java.lang.ClassCastException: com.hibernate.pojo.StudentTeacherLink)
Student stu = (Student)it.next();
System.out.println(stu.getSname());
}
tr.commit();
}catch(Exception e){
e.printStackTrace();
tr.rollback();
}finally{
session.close();
}
}
public static void main(String[] args){
//UtilDAO.saveStudent();
UtilDAO.printStudent();
}
}

问题:
1.请问:我能这样获取学生集合吗?
Set set = ter.getStudentTeacherLinks();

2.请问:我这样关联学生和老师的对象对吗?
StudentTeacherLink st1 = new StudentTeacherLink(tea1,stu1);

3.我如果想通过老师对象来查看对应的学生集合该怎么做呢?
banq

悄悄话
发表文章: 9528
注册时间: 2002年08月03日 17:08
回复:关于Hibernate多对多拆分为多个一对多的问题. 2007年05月16日 11:02 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
你使用Hibernate的方式就是错误的。
你是先有数据库:>create table student

所以产生后面琐碎问题,就象使用扳手工具,你是倒过来拿,你还要求扳手帮你做更多活,怎么可能。

相关贴:
http://www.jdon.com/jivejdon/thread/31684.html
这个主题有 2 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  每2分种自动备份发贴内容Ctrl-V粘贴取出,提问题前先查询标签列表

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam