数据库连接应该是没有问题的。
persistence.xml文件:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
实体bean(Student):
package lun.beans;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Student {
private String studentID;
private String studentName;
private String studentPassWord;
private String studentConnection;
private String studentGender;
private Set courses = new HashSet();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public String getStudentID() {
return studentID;
}
public void setStudentID(String studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentPassWord() {
return studentPassWord;
}
public void setStudentPassWord(String studentPassWord) {
this.studentPassWord = studentPassWord;
}
public String getStudentConnection() {
return studentConnection;
}
public void setStudentConnection(String studentConnection) {
this.studentConnection = studentConnection;
}
public String getStudentGender() {
return studentGender;
}
public void setStudentGender(String studentGender) {
this.studentGender = studentGender;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Student_Course",
joinColumns = {@JoinColumn(name = "studentID", referencedColumnName = "studentID")},
inverseJoinColumns = {@JoinColumn(name = "courseID", referencedColumnName = "courseID")})
public Set getCourses() {
return courses;
}
public void setCourses(Set courses) {
this.courses = courses;
}
public Student() {
}
}
实体bean(Course):
package lun.beans;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Course {
private String courseID;
private String courseName;
private String courseTeacherID;
private String courseTeacherName;
private String courseDescription;
private String courseState;//打开状态 = 1,关闭状态 = 2;
private Set students = new HashSet();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public String getCourseID() {
return courseID;
}
public void setCourseID(String courseID) {
this.courseID = courseID;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseTeacherID() {
return courseTeacherID;
}
public void setCourseTeacherID(String courseTeacherID) {
this.courseTeacherID = courseTeacherID;
}
public String getCourseTeacherName() {
return courseTeacherName;
}
public void setCourseTeacherName(String courseTeacherName) {
this.courseTeacherName = courseTeacherName;
}
public String getCourseDescription() {
return courseDescription;
}
public void setCourseDescription(String courseDescription) {
this.courseDescription = courseDescription;
}
public String getCourseState() {
return courseState;
}
public void setCourseState(String courseState) {
this.courseState = courseState;
}
@ManyToMany(mappedBy = "courses")
public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
}
}
使用Junit4测试时:
@Test
public void testrun(){
EntityManager em = Persistence.createEntityManagerFactory("lun").createEntityManager();
EntityTransaction ctx = em.getTransaction();
ctx.begin();
Student s = new Student();
s.setStudentConnection("123");
s.setStudentGender("123");
s.setStudentName("123");
s.setStudentGender("1");
em.persist(s);
ctx.commit();
em.close();
}
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert: [lun.beans.Student]
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
at unit.test.testTest.testrun(testTest.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [lun.beans.Student]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:154)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:110)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:646)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:620)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:624)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220)
... 21 more
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'lunuse.student' doesn't exist
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
... 36 more
数据库里生成了student与course的关系表student_course 可是生成不了student 和course.这是为什么呢?
错误显示表不存在,可是JPA应该是可以自动建立表的?为什么它会说表不存在。
问题补充:
我用的是JPA,您回答的是hibernate。
而且我想知道,为什么要针对数据库调节呢?要调节的东西具体又有哪些?
谢谢。