【发布时间】:2013-11-23 12:22:52
【问题描述】:
我创建了 2 个具有多对多关系的实体(学生和课程),我分别创建了学生和课程,这意味着我可以先创建没有课程的学生或没有学生的课程。
<?xml version="1.0"?>
<!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="com.school.Student" table="student">
<id name="id" column="student_id" length="32">
<generator class="uuid"></generator>
</id>
<property name="fullName" type="string">
<column name="full_name" length="40" />
</property>
<version name="version" column="VERSION" type="integer" />
<property name="createdBy" type="string">
<column name="created_by" length="50" />
</property>
<property name="createdDate" type="timestamp">
<column name="created_date" length="29" />
</property>
<property name="updatedBy" type="string">
<column name="updated_by" length="50" />
</property>
<property name="updatedDate" type="timestamp">
<column name="updated_date" length="29" />
</property>
<set name="course" table="student_course"
lazy="false" cascade="all" inverse="true">
<key column="student_id" />
<many-to-many column="course_id" class="com.school.Course" />
</set>
</class>
<class name="com.school.Course" table="course">
<id name="id" column="course_id" length="32">
<generator class="uuid"></generator>
</id>
<property name="limit" type="int">
<column name="limit" />
</property>
<property name="courseName" type="string">
<column name="course_name" length="50" />
</property>
<version name="version" column="VERSION" type="integer" />
<property name="createdBy" type="string">
<column name="created_by" length="50" />
</property>
<property name="createdDate" type="timestamp">
<column name="created_date" length="29" />
</property>
<property name="updatedBy" type="string">
<column name="updated_by" length="50" />
</property>
<property name="updatedDate" type="timestamp">
<column name="updated_date" length="29" />
</property>
<set name="student" table="student_course"
lazy="false" cascade="all">
<key>
<column name="course_id"/>
</key>
<many-to-many column="student_id" class="com.school.Student" />
</set>
</class>
</hibernate-mapping>
学生班:
public class Student implements java.io.Serializable, Entity {
private static final long serialVersionUID = -546886879998950467L;
private String id;
private int version;
private String createdBy;
private String updatedBy;
private Date createdDate;
private Date updatedDate;
private String fullName;
private Set<Course> course = new HashSet<Course>(0);
public Set<Course> getCourse(){
return course;
}
public void setCourse(Set<Course> c){
this.course=c;
}
public boolean isNew() {
return (getId() == null || getId().isEmpty());
}
public Student() {
}
public int getVersion() {
return this.version;
}
public void setVersion(int version) {
this.version = version;
}
@Override
public int hashCode() {
return new BigInteger(getId(), 16).hashCode();
}
public boolean equals(Student s) {
return getId().equals(s.getId());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Student) {
Student s = (Student) obj;
return equals(s);
}
return false;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getUpdatedBy() {
return updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getUpdatedDate() {
return updatedDate;
}
public void setUpdatedDate(Date updatedDate) {
this.updatedDate = updatedDate;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getFullName() {
return fullName;
}
}
课程类别:
public class Course implements java.io.Serializable, Entity {
private static final long serialVersionUID = -7827469634033428134L;
private String id;
private int version;
private String createdBy;
private String updatedBy;
private Date createdDate;
private Date updatedDate;
private String courseName;
private int limit;
private Set<Student> student = new HashSet<Student>(0);
public Set<Course> getStudent(){
return student;
}
public void setStudent(Set<Student> s){
this.student=s;
}
public boolean isNew() {
return (getId() == null || getId().isEmpty());
}
public Course() {
}
public int getVersion() {
return this.version;
}
public void setVersion(int version) {
this.version = version;
}
@Override
public int hashCode() {
return new BigInteger(getId(), 16).hashCode();
}
public boolean equals(Course c) {
return getId().equals(c.getId());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Course) {
Course c = (Course) obj;
return equals(c);
}
return false;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getUpdatedBy() {
return updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getUpdatedDate() {
return updatedDate;
}
public void setUpdatedDate(Date updatedDate) {
this.updatedDate = updatedDate;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
public int getLimit() {
return this.limit;
}
public void setLimit(int l) {
this.limit = l;
}
}
控制器代码:
for(int i=0;selectCourse.getChosenDataList()!=null && selectCourse.getChosenDataList().size()<i;i++){
Course c = (Course)selectCourse.getChosenDataList()get(i);
student.getCourseList().add(c);
}
.....
......
try {
getStudentService().saveOrUpdate(student);
} catch (DataAccessException e) {
MessageUtils.showErrorMessage(e.getMostSpecificCause().toString());
return;
}
休眠显示sql:
Hibernate:
insert
into
student
(fullName, VERSION, created_by, created_date, updated_by, updated_date)
values
(?, ?, ?, ?, ?, ?, ?)
它没有为表 student_course 生成插入语句。 我是否需要为 student_course 关系创建 projo 和 dao 并自己完成?
我阅读了一些在线示例,例如http://viralpatel.net/blogs/hibernate-many-to-many-xml-mapping-example/,我认为我的做法几乎和他们一样,但它们是关系双方的新对象。
谁能指出我错过了什么?还是每次新学生创建或编辑课程集时我都需要自己创建关系?
非常感谢。
【问题讨论】:
标签: java hibernate many-to-many