日期:2014-05-18  浏览次数:20648 次

新手提问,关于hibernate多对多的。
现在有两个类:试卷(Paper),还有试题(Subject),现在这两个是多对多的关系,一个试题可以属于多个试卷,一张试卷可以有多个试题,我在数据库里是设了第三张表试卷试题表(PaperSubject),里面有字段(id,Paperid,Subjectid),然后我想给定一个Paperid去查询这张试卷有哪些试题,就是去PaperSubject里查询,把所属的Subject信息全部查询出来,但是我在Dao层hibernate查询不会写,求大神指点一下,这样怎么设计比较合理,我会配多对多,可多对多的查询不会,求指导下。
------解决方案--------------------
很简单啊,在你的PaperSubject里分别给Paper和Subject都设置ManyToOne,单向关联就够了,查询的时候这样:
select subject from PaperSubject ps where ps.paper.paparid=?
你这样就查出了所有指定的subject 对象
------解决方案--------------------
2L说的对,支持一下
------解决方案--------------------

Paper类:
package com.donald.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Paper {

private Integer id;
private String name;
private Set<Subject> subjects = new HashSet<Subject>();

@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="pater_subject",
joinColumns={@JoinColumn(name="paperId")},
inverseJoinColumns={@JoinColumn(name="subjectId")}
)
public Set<Subject> getSubjects() {
return subjects;
}
public void setSubjects(Set<Subject> subjects) {
this.subjects = subjects;
}
}
Subject类:
package com.donald.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Subject {

private Integer id;
private String name;
private Set<Paper> papers = new HashSet<Paper>();

@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(mappedBy="subjects")
public Set<Paper> getPapers() {
return papers;
}
public void setPapers(Set<Paper> papers) {
this.papers = papers;
}
}
测试代码:
Session session = factory.openSession();
Paper p = (Paper)session.get(Paper.class, 1);
System.out.println(p.getSubjects());

这样通过Paper的id号去查Paper对象,从Paper对象中取出Subject列表就可以了。