问题 一个学生对应多门课 一个课对应多门学生 先要对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
现有数据库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
如何更行啊 能帮忙写具体代码吗
我这样写的 会报错
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)
应该有三个实体类,Class/Student/S_C,
然后Class和S_C是一对多的关系,Student和S_C是一对多的关系
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(分数);
供参考^_^
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>非常感谢你的回答