最近在学Hibernate,写了一个小程序,有学生、课程、分数三张表,学生和课程多对多关系,用分数做中间表,不想用联合主键。建了Student、Course、Score三个类。
学生表有Id(主键)和name两个字段、课程表有Id(主键)和name两个字段,score表有Id(主键)、score、student_id(外键)、course_id(外键)四个字段。Student类:
package com.bjsxt.hibernate;import java.util.HashSet;
import java.util.Set;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;@Entity
public class Student {
private int id;
private String name;
private Set<Course> courses = new HashSet<Course>();
//Id做主键,并自动生成。
@Id
@GeneratedValue
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;
}
//建立和course的联系,类型ManyToMany,中间表名score。
@ManyToMany
@JoinTable(name="score",
joinColumns=@JoinColumn(name="student_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="course_id", referencedColumnName="id")
)
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}

}课程类:
package com.bjsxt.hibernate;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;@Entity
public class Course {
private int id;
private String name;
//主键为Id,自动生成。
@Id
@GeneratedValue
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;
}

}Score类:
package com.bjsxt.hibernate;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;@Entity
@Table(name="score")
public class Score {
private int id;
private int score;
private Student student;
private Course course;
//主键为Id,自动生成
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//建立和student的联系,外键名为student_id。
@ManyToOne
@JoinColumn(name="student_id")
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
//建立和course的联系,外键名为course_id
@ManyToOne
@JoinColumn(name="course_id")
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}

}测试方法:
import java.util.Map;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;public class HibernateTreeTest {
private static SessionFactory sessionFactory;

@BeforeClass
public static void beforeClass() {
//new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}//存储方法,Student、Course、Score各存储一个对象。
@Test
public void testSave() {
Student student = new Student();
student.setName("zhangsan");
Course course = new Course();
course.setName("java");
Score score = new Score();
score.setCourse(course);
score.setStudent(student);

Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(student);
session.save(course);
session.save(score);

session.getTransaction().commit();
session.close();
}

//自动生成表
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}


public static void main(String[] args) {
beforeClass();
}
}问题一:运行testSave方法,报错:org.hibernate.exception.GenericJDBCException: could not insert:[com.bjsxt.hibernate.Score]。原因是Score类中设计的是用Id做主键,并自动生成Id。但是自动生成的表中,默认student_id和course_id做了联合主键,删除score表,手动建表,运行testSave方法,还是会出现一样的情况,student_id和course_id还是默认联合主键。问题二:如果把Student类中ManyToMany的关系删掉,运行testSave方法,报错:java.lang.NullPointerException   提示出错行为@AfterClass里的sessionFactory.close();问题三:不能使用getCurrentSession方法,报错:org.hibernate.HibernateException: No CurrentSessionContext configured!

请问这是怎么回事,怎样解决?配置应该没问题,项目是copy上一个然后改的,上一个运行正常(但单独运行beforeClass()和afterClass()会出错),所以觉得不是配置问题(但上一个也不能用getCurrentSession方法)。
所用工具:MyEclipse6.0
hibernate-distribution-3.3.2.GA-dist
hibernate-annotations-3.4.0.GA,jdk6.0
junit4.8
mysql-connector-java-5.0.8
mysql-noinstall-5.0.95-winx64
apache-tomcat-6.0.35不好意思,没分了,只能给这点了。