问题 一个学生对应多门课 一个课对应多门学生 先要对s_c表中的一个学生打分 怎么办
现有数据库create table student(
sid varchar(32) not null primary key,
name varchar(10) not null,
age int(2),
tel varchar(11),
grade varchar(4),
sex char(2),
major varchar(20));create table class(
cid varchar(32) not null primary key,
name varchar(10) not null);
create table s_c(
sid varchar(32) ,
cid varchar(32) ,
score int (3),
FOREIGN KEY (sid) REFERENCES student(sid) ON DELETE CASCADE ,
FOREIGN KEY (cid) REFERENCES class(cid) ON DELETE CASCADE,
primary key(sid,cid));
hibernate 配置文件
class.hbm.xml
<hibernate-mapping>
 <class catalog="eol" name="com.chang.hbm.Class" table="class">
  <id name="cid" type="string">
   <column length="32" name="cid"/>
   <generator class="uuid.hex"/>
  </id>
  <property generated="never" lazy="false" name="name" type="string">
   <column length="10" name="name" not-null="true"/>
  </property>
  <set cascade="all" inverse="false" lazy="false" name="student" 
   sort="unsorted" table="s_c">
   <key>
    <column length="32" name="cid" not-null="false"/>
   </key>
   <many-to-many class="com.chang.hbm.Student" column="sid" unique="false"/>
  </set>student-hbm.xml<hibernate-mapping>
 <class catalog="eol" name="com.chang.hbm.Student" table="student">
  <id name="sid" type="string">
   <column length="32" name="sid"/>
   <generator class="assigned"/>
  </id>
  <property generated="never" lazy="false" name="name" type="string">
   <column length="10" name="name" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="age" type="integer">
   <column name="age"/>
  </property>
  <property generated="never" lazy="false" name="tel" type="string">
   <column length="11" name="tel"/>
  </property>
  <property generated="never" lazy="false" name="grade" type="string">
   <column length="4" name="grade"/>
  </property>
  <property generated="never" lazy="false" name="sex" type="string">
   <column length="2" name="sex"/>
  </property>
  <property generated="never" lazy="false" name="major" type="string">
   <column length="20" name="major"/>
  </property>
  <set lazy="false" name="class1" sort="unsorted" table="s_c" cascade="all">
   <key>
    <column length="32" name="sid" not-null="false"/>
   </key>
   <many-to-many class="com.chang.hbm.Class" column="cid" unique="false"/>
  </set>
Hibernate

解决方案 »

  1.   


    如何更行啊 能帮忙写具体代码吗
    我这样写的 会报错
                    String hql="update  s_c  set score=? where sid=? ";
    Query q=this.session.createQuery(hql);
    q.setInteger(0, score);
    q.setSerializable(1, sid);
    q.executeUpdate();
    错误 :
    org.hibernate.hql.internal.ast.QuerySyntaxException: s_c is not mapped [update  s_c  set score=? where sid=? ]
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
      

  2.   

    哦,不对,你这个配置有点问题,
    应该有三个实体类,Class/Student/S_C,
    然后Class和S_C是一对多的关系,Student和S_C是一对多的关系
      

  3.   

    QBC的话,大概是这样,
    Criteria criteria = this.session.createCriteria(S_C.class);
    criteria.createAlias("student", "s");
    criteria.createAlias("class", "c");
    criteria.add(Restrictions.eq("s.sid", "学生Id"));
    criteria.add(Restrictions.eq("c.cid", "课程Id"));
    List<S_C> list = criteria.list();
    if (list.isEmpty())
      // 学生没选修这门课
    if (list.size() != 1)
      // 数据保存有错
    else
      list.get(0).setScore(分数);
    供参考^_^
      

  4.   

    问题解决了  不用改配置 添加一个新的hbm.xml文件就好了 
     
    S_C-hbm.xml
       <hibernate-mapping>
        <class name="com.chang.hbm.S_C" table="s_c" catalog="eol" >
            <composite-id >
                <key-many-to-one name="student" class="com.chang.hbm.Student" >
                    <column name="sid" length="32" />
                </key-many-to-one>
                
                <key-many-to-one name="class1" class="com.chang.hbm.Class">
                    <column name="cid" length="32" />
                </key-many-to-one>
            </composite-id>
            <property name="score" type="integer">
                <column name="score" />
            </property>
        </class>
    </hibernate-mapping>非常感谢你的回答