问题的描述非常简单:
  有3个东西,学校->年级->班级,问题在于删除年级时级联删除班级。
  school(主键:schoolid),grade(主键:schoolid,gradeid),tclass(主键:schoolid,gradeid,tclassid)
  grade和tclass有点复合外健的味道,但是设置复合外健后eclipse自动生成的.hbm报错,所以我没在grade和tclass上设置外健,而是手工添加了两段。
               <set name="tclassSet" inverse="true" cascade="all">
         <key>
         <column name="schoolid"/>
         <column name="gradeid"/>
         </key>
         <one-to-many class="Tclass"/>
        </set>
                <many-to-one name="grade" class="Grade">
         <column name="schoolid"/>
         <column name="gradeid"/>
        </many-to-one>
结果加载hibernate时,配置文件出错。
详细内容请看下贴

解决方案 »

  1.   

    --1.数据库操作
    create table school (
      schoolid    int   not null,
      schoolName  varchar(50) not null,
      notes       varchar(200),
      constraint PK_SCHOOL primary key (schoolid)
    );
    create table grade (
      schoolid    int      not null,
      gradeid     int      not null,
      gradeName   varchar(50),
      notes       varchar(200),
      constraint PK_GRADE primary key (schoolid,gradeid)
    );
    create table tClass(
      schoolid    int      not null,
      gradeid     int      not null,
      tclassid     int      not null,
      tclassName   varchar(50),
      notes       varchar(200),
      constraint PK_GRADE primary key (schoolid,gradeid,tclassid)
    );

    alter table grade
       add constraint fk_grade_school foreign key(schoolid)
          references school(schoolid)
    ;
    /*
    alter table tClass
       add constraint fk_tclass_grade foreign key(schoolid,gradeid)
          references  grade(schoolid,gradeid)
    ;*/

    insert into school(schoolid,schoolname,notes)values(123,'highschool','test');
    insert into grade(schoolid,gradeid,gradename)values(123,234,'g1');
    insert into tclass(schoolid,gradeid,tclassid,tclassname)values(123,234,345,'test');--2.hibernate配置文件(3个,school的省略,只列出grade,tclass)
    --grade.hbm.xml
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
                                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

    <!-- DO NOT EDIT: This is a generated file that is synchronized -->
    <!-- by MyEclipse Hibernate tool integration.                   -->
    <!-- Created Tue Dec 12 14:44:40 CST 2006                         -->
    <hibernate-mapping package="model">

        <class name="Grade" table="grade">
            <composite-id name="id" class="GradeKey">
                <key-property name="gradeid" column="gradeid" type="java.lang.Integer"/>
                <key-many-to-one name="school" column="schoolid" class="School"/>
            </composite-id>
     
            <property name="gradename" column="gradeName" type="java.lang.String" />
            <property name="notes" column="notes" type="java.lang.String" />
            <set name="tclassSet" inverse="true">
             <key>
             <column name="schoolid"/>
             <column name="gradeid"/>
             </key>
             <one-to-many class="Tclass"/>
            </set>
        </class>
        
    </hibernate-mapping>

    --tclass.hbm.xml
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
                                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

    <!-- DO NOT EDIT: This is a generated file that is synchronized -->
    <!-- by MyEclipse Hibernate tool integration.                   -->
    <!-- Created Tue Dec 12 14:44:44 CST 2006                         -->
    <hibernate-mapping package="model">

        <class name="Tclass" table="tclass">
            <composite-id name="id" class="TclassKey">
                <key-property name="gradeid" column="gradeid" type="java.lang.Integer"/>
                <key-property name="schoolid" column="schoolid" type="java.lang.Integer"/>
                <key-property name="tclassid" column="tclassid" type="java.lang.Integer"/>
            </composite-id>
     
            <property name="tclassname" column="tclassName" type="java.lang.String" />
            <property name="notes" column="notes" type="java.lang.String" />
            <many-to-one name="grade" class="Grade">
             <column name="schoolid"/>
             <column name="gradeid"/>
            </many-to-one>
        </class>
        
    </hibernate-mapping>--3.java类
    --*************AbstractGrade.java*************--
    package model; import java.io.Serializable;

    public abstract class AbstractGrade 
        implements Serializable
    {
    private int hashValue = 0;
        private GradeKey id;
        private java.lang.String gradename;
        private java.lang.String notes;
        private java.util.Set tclassSet;

    public java.util.Set getTclassSet() {
    return tclassSet;
    }

    public void setTclassSet(java.util.Set tclassSet) {
    this.tclassSet = tclassSet;
    }

        public AbstractGrade()
        {
        }

        public AbstractGrade(GradeKey id)
        {
            this.setId(id);
        }

        public GradeKey getId()
        {
            return this.id;
        }

        public void setId(GradeKey id)
        {
            this.hashValue = 0;
            this.id = id;
        }

        public java.lang.String getGradename()
        {
            return this.gradename;
        }

        public void setGradename(java.lang.String gradename)
        {
            this.gradename = gradename;
        }

        public java.lang.String getNotes()
        {
            return this.notes;
        }
        
        public void setNotes(java.lang.String notes)
        {
            this.notes = notes;
        }
        
        public boolean equals(Object rhs)
        {
            if (rhs == null)
                return false;
            if (! (rhs instanceof Grade))
                return false;
            Grade that = (Grade) rhs;
            if (this.getId() == null || that.getId() == null)
                return false;
            return (this.getId().equals(that.getId()));
        }
        
        public int hashCode()
        {
            if (this.hashValue == 0)
            {
                int result = 17;
                if (this.getId() == null)
                {
                    result = super.hashCode();
                }
                else
                {
                    result = this.getId().hashCode();
                }
                this.hashValue = result;
            }
            return this.hashValue;
        }
    }

    --*************AbstractTclass.java*************--
    package model; import java.io.Serializable;
    public abstract class AbstractTclass 
        implements Serializable
    {
        private int hashValue = 0;
        private TclassKey id;
        private java.lang.String tclassname;
        private java.lang.String notes;
        private Grade grade;

    public Grade getGrade() {
    return grade;
    }

    public void setGrade(Grade grade) {
    this.grade = grade;
    }

        public AbstractTclass()
        {
        }

        public AbstractTclass(TclassKey id)
        {
            this.setId(id);
        }

        public TclassKey getId()
        {
            return this.id;
        }

        public void setId(TclassKey id)
        {
            this.hashValue = 0;
            this.id = id;
        }

        public java.lang.String getTclassname()
        {
            return this.tclassname;
        }

        public void setTclassname(java.lang.String tclassname)
        {
            this.tclassname = tclassname;
        }

        public java.lang.String getNotes()
        {
            return this.notes;
        }

        public void setNotes(java.lang.String notes)
        {
            this.notes = notes;
        }

        public boolean equals(Object rhs)
        {
            if (rhs == null)
                return false;
            if (! (rhs instanceof Tclass))
                return false;
            Tclass that = (Tclass) rhs;
            if (this.getId() == null || that.getId() == null)
                return false;
            return (this.getId().equals(that.getId()));
        }

        public int hashCode()
        {
            if (this.hashValue == 0)
            {
                int result = 17;
                if (this.getId() == null)
                {
                    result = super.hashCode();
                }
                else
                {
                    result = this.getId().hashCode();
                }
                this.hashValue = result;
            }
            return this.hashValue;
        }
    }
      

  2.   

    没搞明白为什么要用多重主键
    建议用单一ID做主键,有关联的根据需要配置:<one-to-many>或者<many-to-one>
      

  3.   

    我用的是main()方法测试,报的是java.lang.NoClassDefFoundError
    debug发现是session = HibernateUtil.currentSession();这句报的错。
    实际上就是配置文件的错。
      

  4.   

    哪个class找不到?
    是不是配置文件里面没加package名