【问题标题】:Hibernate cannot save the relation between the EntitiesHibernate 无法保存实体之间的关系
【发布时间】: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


    【解决方案1】:

    我们又来了。

    您的关联是双向的。在双向关联中,有一个所有者端(这里:Course.student,顺便说一句,应该命名为students)和一个反向端(这里:Student.course,顺便说一句,应该命名为courses)。

    您的代码只设置了关联的反面,并没有设置所有者。由于 Hibernate 只考虑关联的所有者方,因此不会保存关联。

    所以,您需要致电c.getStudents().add(student)

    【讨论】:

    • 嗨,JB,谢谢你,它真的拯救了关系,现在拯救了我;)
    猜你喜欢
    • 2017-05-05
    • 2014-11-27
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多