我是Hibernate的初学者,无法理解我在程序的哪一部分出错了。任何人都可以请问是什么原因导致这种类型的错误:
org.hibernate.InvalidMappingException: unable to read xml
ManyToManyDemo.java -它包含持久性类和用于插入数据的Test类。
import java.util.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.Transaction;
class Student {
private int sid = 0;
private String sname = null;
private Set<Course> courses = null;
public int getSid() {
return this.sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return this.sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Course> getCourses() {
return this.courses;
}
public void setcourses(Set<Course> courses) {
this.courses = courses;
}
Student(int sid, String sname) {
setSid(sid);
setSname(sname);
}
}
class Course {
private int cid = 0;
private String cname = null;
private Set<Student> students = null;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return this.cname;
}
public void setCname(String cname) {
this.cname=cname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
Course(int cid, String cname) {
setCid(cid);
setCname(cname);
}
}
class Test {
private SessionFactory factory = null;
public void initSessionFactory() {
Configuration config = new Configuration().configure("hibernate.cfg.xml");
ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
factory = config.buildSessionFactory(registry);
}
public void createCourseAndStudents() {
Session session = factory.getCurrentSession();
Transaction tx = null;
Set<Student> studentset = new HashSet<Student>();
Course course = null;
Student s1 = new Student(5, "Halle Price");
Student s2 = new Student(3, "William Wick");
studentset.add(s1);
studentset.add(s2);
course = new Course(24, "Django");
course.setStudents(studentset);
tx = session.beginTransaction();
session.save(course);
tx.commit();
}
}
public class ManyToManyDemo {
public static void main(String[] args) {
Test t = new Test();
t.initSessionFactory();
t.createCourseAndStudents();
}
}
course.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Course" table="coursetab">
<id name = "cid" column = "cid">
<!--<generator class="native"/>-->
</id>
<property name= "cname" column = "cname"/>
</class>
<set name="students" inverse="false" lazy="false" table="student_course" cascade="all">
<key column="cid" not-null="true"/>
<many-to-many column="sid" class="Student"/>
</set>
</hibernate-mapping>
student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Student" table="studenttab">
<id name = "sid" column = "sid">
<generator class="native"/>
</id>
<property name= "sname" column = "sname"/>
</class>
<set name="courses" inverse = "true" lazy="false" table="student_course" cascade="all">
<key column="sid" not-null="true"/>
<many-to-many column="cid" class="Course"/>
</set>
</hibernate-mapping>
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/demodb</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">dbuser</property>
<property name="connection.password">dbpassword</property>
<property name="connection.pool_size">0</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="current_session_context_class">thread</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="student.hbm.xml" />
<mapping resource="course.hbm.xml" />
</session-factory>
</hibernate-configuration>
链接表
create table student_course (cid int not null, sid int not null, primary key(cid, sid), constraint fk_cid foreign key(cid) references coursetab(cid), constraint fk_sid foreign key(sid) references studenttab(sid));
最佳答案
看起来您的XML错误。如果您使用的是Eclipse(或其他某种IDE),通常会有一个“验证”选项(在Eclipse中,右键单击文本编辑器,然后选择“验证”)。
当我在您的course.hbm.xml文件中执行此操作时,它表示hibernate-mapping标签的内容错误。
看起来您已经在类外部定义了“集合”?
当我将文件更改为此时...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Course" table="coursetab">
<id name="cid" column="cid">
<!--<generator class="native"/>-->
</id>
<property name="cname" column="cname"/>
<set name="students" inverse="false" lazy="false" table="student_course" cascade="all">
<key column="cid" not-null="true"/>
<many-to-many column="sid" class="Student"/>
</set>
</class> <!-- I moved this tag here to be below the set element -->
</hibernate-mapping>
我没有验证错误。