hibernate多对多映射问题求助

guangzhe_yue 2008-04-15 02:54:45
一下是相关的文件:
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)


如何解决,请各位高手指点
...全文
340 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
henry1451 2008-04-21
  • 打赏
  • 举报
回复
<set name="userRole" table="ROLE_USER_MAP">
<key column="userId" />
<many-to-many column="ROLE_ID" class="RoleInfo" />
</set>
=================================
RoleInfo这块没有包吗,是不是没有加上包名.
Leo1734 2008-04-16
  • 打赏
  • 举报
回复
试试在2个.hbm.xml中配置inverse
yibunengjing 2008-04-15
  • 打赏
  • 举报
回复
先确认
UserInfo aUser = (UserInfo) session.get(UserInfo.class, userId);
RoleInfo aRole = (RoleInfo) session.get(RoleInfo.class, roleId);
aUser.getUserRole().add(aRole);
中的aUser 和 aRole 的值,别aUser 这个就是个null值
awusoft 2008-04-15
  • 打赏
  • 举报
回复
是不是两边都是many-to-many的哦,都配置一下看看吧.我没怎么用Hiberntate,以前玩过
guangzhe_yue 2008-04-15
  • 打赏
  • 举报
回复
<hibernate-mapping package="org.gavin.portal.uim"> 这块有Package的声明
forestking_xx 2008-04-15
  • 打赏
  • 举报
回复
sorry, 弄错了。学习。。。
forestking_xx 2008-04-15
  • 打赏
  • 举报
回复
据我所知,many-to-many 是双向关联的吧。单向的话,应该one-to-many 吧。
gongyali2005 2008-04-15
  • 打赏
  • 举报
回复
<many-to-many column="ROLE_ID" class="RoleInfo" />
你的ROLEINFO在默认包下啊?

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧