Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate,多对多关系查询_Java_Spring_Oracle_Hibernate - Fatal编程技术网

Java Spring Hibernate,多对多关系查询

Java Spring Hibernate,多对多关系查询,java,spring,oracle,hibernate,Java,Spring,Oracle,Hibernate,我有两个bean类学生和课程,它们之间有着多对多的关系。例如,一个学生可以注册多个课程,反之亦然。我使用HibernateTemplate将对象保存到Oracle数据库中。以下是学生、课程和学生的课堂 学生班 package com.springhibernate; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persiste

我有两个bean类学生和课程,它们之间有着多对多的关系。例如,一个学生可以注册多个课程,反之亦然。我使用HibernateTemplate将对象保存到Oracle数据库中。以下是学生、课程和学生的课堂

学生班

package com.springhibernate;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="Student")

public class Student {
    private int studentId;
    private String firstName;
    private String lastName;
    private Set<Course> courses;

@Id
@Column(name="student_id")
public int getStudentId() {
    return studentId;
}
public void setStudentId(int studentId) {
    this.studentId = studentId;
}

@Column(name="first_name")
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

@Column(name="last_name")
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Student_Course", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
public Set<Course> getCourses() {
    return courses;
}
public void setCourses(Set<Course> courses) {
    this.courses = courses;
}

}
package com.springhibernate;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

public class StudentDao {

private static Helper helper = new Helper();

HibernateTemplate template;
public void setTemplate(HibernateTemplate template) {
    this.template = template;
}

// method to save student
public void saveStudent(Student s) {
    template.save(s);
}

// method to return one employee of given id
public Student getById(int id) {
    Student s = (Student) template.get(Student.class, id);
    return s;
}

public List<Course> findCourse(){
    List<Course> list = template.find("from Course");
    return list;
}
}
package com.springhibernate;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;


@Entity
@Table(name="Course")
public class Course {

private int courseId;
private String courseName;
private Set<Student> students;

@Id
@Column(name="course_id")
public int getCourseId() {
    return courseId;
}
public void setCourseId(int courseId) {
    this.courseId = courseId;
}

@Column(name="course_name")
public String getCourseName() {
    return courseName;
}
public void setCourseName(String courseName) {
    this.courseName = courseName;
}

@ManyToMany(cascade=CascadeType.ALL,mappedBy="courses")
public Set<Student> getStudents() {
    return students;
}
public void setStudents(Set<Student> students) {
    this.students = students;
}

@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return this.courseId;
}

@Override
public boolean equals(Object o) {
    // TODO Auto-generated method stub
    Course temp = (Course) o;
    return (this.courseId==temp.courseId);

}
}
请注意,我只希望课程id列不完整

  • 如果在student_课程表中,我想再增加一列,比如说课程名称(来自课程表),我该怎么做


  • 您可以通过以下方式完成,但请记住HibernateTemplate是一个旧API,您应该使用EntityManager(Factory)等。 你可以通过Perience类获得它

    hibernateTemplate.execute(new HibernateCallback<List>() {
    
        public String doInHibernate(Session s)
                throws HibernateException, SQLException {
            SQLQuery sql=s.createSQLQuery("select course_id from student_course where student_id=?");
                sql.setParameter(0, adventureId);
            sql.addScalar(studentID);
            return sql.list();
        }
    });
    
    hibernateTemplate.execute(新的HibernateCallback(){
    公共字符串doInHibernate(会话s)
    抛出HibernateeException、SQLException{
    SQLQuery sql=s.createSQLQuery(“从学生课程中选择课程id,其中学生id=?”;
    setParameter(0,冒险家ID);
    addScalar(studentID);
    返回sql.list();
    }
    });
    
    我以以下方式更改了StudentDao代码。。public List findCourse(final int sid){List List List List=template.execute(new HibernateCallback(){public List doInHibernate(sessions s)抛出hibernateeexception,SQLException{SQLQuery sql=s.createSQLQuery(“从学生所在的课程中选择课程id,学生id=?”);sql.setParameter(0,sid);返回sql.List();});返回列表;}输出:休眠:从学生课程中选择课程id,其中学生id=?注册的课程是:null可以回答我的2个问题吗?你的一般问题的用例是可以提问的。为什么不让学生在对象级别上导航到课程并获取他们的名字?hibernate的目的是抽象关系数据库。
    hibernateTemplate.execute(new HibernateCallback<List>() {
    
        public String doInHibernate(Session s)
                throws HibernateException, SQLException {
            SQLQuery sql=s.createSQLQuery("select course_id from student_course where student_id=?");
                sql.setParameter(0, adventureId);
            sql.addScalar(studentID);
            return sql.list();
        }
    });