一下是相关的文件:
1.TestAction.java
package test;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.gavin.portal.comm.HibernateSessionFactory;
import org.gavin.portal.uim.RoleInfo;
import org.gavin.portal.uim.UserInfo;
import org.hibernate.Session;public class TestAction extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.addUser2Role("6", "2");
response.sendRedirect("/portal/index.jsp");
} private void addUser2Role(String userId, String roleId) {
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
UserInfo aUser = (UserInfo) session.get(UserInfo.class, userId);
RoleInfo aRole = (RoleInfo) session.get(RoleInfo.class, roleId);
aUser.getUserRole().add(aRole);
session.getTransaction().commit();
}
}
2.portal.cfg.xml文件:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>    <session-factory>
        <property name="connection.username">portal</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="myeclipse.connection.profile">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.password">portal</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="show_sql">true</property>
        <mapping resource="uim.hbm.xml"/>
    </session-factory></hibernate-configuration>
3.uim.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">
<hibernate-mapping package="org.gavin.portal.uim"> <!-- 角色基本信息 -->
<class name="RoleInfo" table="ROLE_INFO">
<id name="roleId" column="ROLE_ID">
<generator class="sequence">
<param name="sequence">SEQ_ROLEINFO_ID</param>
</generator>
</id>
<property name="roleName" column="ROLE_NAME" />
<property name="parentRoleId" column="PARENT_ROLE_ID" />
</class> <!-- 用户基本信息 -->
<class name="UserInfo" table="USER_INFO">
<id name="userId" column="U_ID">
<generator class="sequence">
<param name="sequence">SEQ_USERINFO_ID</param>
</generator>
</id>
<property name="userAccount" column="U_ACCOUNT" />
<property name="userPassword" column="U_PASSWORD" />
<property name="userName" column="U_NAME" />
<property name="userNick" column="U_NICK" />
<property name="userTel" column="U_TEL" />
<property name="userSex" column="U_SEX" />
<property name="userBirthday" type="timestamp"
column="U_BIRTHDAY" />
<property name="userEmail" column="U_EMAIL" />
<property name="userIsAvailable" column="IS_AVAILABLE" />
<property name="userPassQuestion" column="PASS_QUESTION" />
<property name="userPassAnswer" column="PASS_ANSWER" />
<set name="userRole" table="ROLE_USER_MAP">
<key column="userId" />
<many-to-many column="ROLE_ID" class="RoleInfo" />
</set>
</class>
</hibernate-mapping>
在程序运行时页面会抛出如下异常:
org.hibernate.exception.SQLGrammarException: could not initialize a collection: [org.gavin.portal.uim.UserInfo.userRole#6]
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.loadCollection(Loader.java:1926)
org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
org.hibernate.collection.PersistentSet.add(PersistentSet.java:165)
test.testAction.addUser2Role(testAction.java:48)
test.testAction.doGet(testAction.java:24)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
如何解决,请各位高手指点

解决方案 »

  1.   

    <many-to-many column="ROLE_ID" class="RoleInfo" /> 
    你的ROLEINFO在默认包下啊?
      

  2.   

    据我所知,many-to-many 是双向关联的吧。单向的话,应该one-to-many 吧。
      

  3.   

    <hibernate-mapping package="org.gavin.portal.uim"> 这块有Package的声明
      

  4.   

    是不是两边都是many-to-many的哦,都配置一下看看吧.我没怎么用Hiberntate,以前玩过
      

  5.   

    先确认
    UserInfo aUser = (UserInfo) session.get(UserInfo.class, userId); 
    RoleInfo aRole = (RoleInfo) session.get(RoleInfo.class, roleId); 
    aUser.getUserRole().add(aRole); 
    中的aUser  和 aRole 的值,别aUser  这个就是个null值
      

  6.   

    <set name="userRole" table="ROLE_USER_MAP"> 
    <key column="userId" /> 
    <many-to-many column="ROLE_ID" class="RoleInfo" /> 
    </set> 
    =================================
    RoleInfo这块没有包吗,是不是没有加上包名.