论坛首页 Java企业应用论坛

请教一个配置一对多关系的问题

浏览 4314 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-07  
Course和CourseCollect分别表示课程和课程收藏. 它们之间是一对多的关系, 即一个课程可以被多个人收藏. 对应的Bean类及hibernate配置文件如下:

Course类 代码
 
  1. package mypackage;  
  2.   
  3. /** 
  4.  * Course 课程 
  5.  */  
  6.   
  7. public class Course implements java.io.Serializable {  
  8.   
  9.     // Fields  
  10.   
  11.     private String id;//课程Id  
  12.   
  13.     private String name;//课程名称  
  14.   
  15.         //setters and getters...  
  16.   
  17. }  
CourseCollect类 代码
 
  1. package mypackage;  
  2.   
  3. /** 
  4.  * UserCollectionCourse 用户收集的课程信息 
  5.  */  
  6.   
  7. public class CourseCollect  implements java.io.Serializable {  
  8.   
  9.   
  10.     // Fields      
  11.   
  12.      private Integer collectionId;//  
  13.      private Course course;//课程  
  14.      private Integer userId;//用户ID  
  15.   
  16.      //setters and getters  
  17.   
  18. }  

Course映射配置 代码
xml 代码
  1. <hibernate-mapping>      
  2.     <class name="mypackage.Course" table="tbl_Course">      
  3.         <id name="id" type="java.lang.String">      
  4.             <column name="CourseId" length="48" />      
  5.             <generator class="assigned">generator>      
  6.         <id>      
  7.         <property name="name" type="java.lang.String">      
  8.             <column name="Name" length="256" />      
  9.         property>      
  10.     class>      
  11. hibernate-mapping>    
CourseCollect映射配置 代码
xml 代码
  1. <hibernate-mapping>      
  2.     <class name="mypackage.CourseCollect" table="tbl_UserCollection_Course" >      
  3.         <id name="collectionId" type="java.lang.Integer">      
  4.             <column name="CollectionId" />      
  5.             <generator class="native">generator>      
  6.         id>      
  7.         <property name="userId" type="java.lang.Integer">      
  8.             <column name="UserId" />      
  9.         property>      
  10.         <many-to-one name="course" class="mypackage.Course" fetch="select">      
  11.             <column name="Course" length="48" />      
  12.         many-to-one>      
  13.     class>      
  14. hibernate-mapping>   

这样的配置在执行以下这个调用时出现了异常:
java 代码
 
  1. private static final  String BOOL_COURSE_ISCOLLECT = "from CourseCollect where userId=? and course=?";  
  2.  
    //通过userId和课程调用查找方法,以判断用户是否已收藏某门课程  
  3. find(BOOL_COURSE_ISCOLLECT,new Object[]{userId,courseId});

    异常信息:
 
  1. 严重: IllegalArgumentException in class: mypackage.Course, getter method of property: id  
  2. org.springframework.orm.hibernate3.HibernateSystemException:
  3. IllegalArgumentException occurred calling getter of mypackage.Course.id;
  4. nested exception is org.hibernate.PropertyAccessException:
  5. IllegalArgumentException occurred calling getter of mypackage.Course.id  
  6. Caused by: org.hibernate.PropertyAccessException:
  7. IllegalArgumentException occurred calling getter of mypackage.Course.id  
  8.     at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)  
  9.     at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)  
  10.     at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591)  
  11.     at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307)  
  12.     at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)  
  13.     at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218)  
  14.     at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)  
  15.     at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87)  
  16.     at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:39)  
  17.     at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:67)  
  18.     at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:396)  
  19.     at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)  
  20.     at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141)  
  21.     at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)  
  22.     at org.springframework.orm.hibernate3.HibernateTemplate$38.doInHibernate(HibernateTemplate.java:1063)  
  23.     at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:367)  
  24.     at org.springframework.orm.hibernate3.HibernateTemplate.bulkUpdate(HibernateTemplate.java:1054)  

如果把其中Course中的id改为int类型的话是没有问题的. 另外如果把运行的HQL语句改为:

改过的HQL语句
 
  1. private static final  String BOOL_COURSE_ISCOLLECT = "from CourseCollect where userId=? and course.id=?";  

运行也没有问题(即将"course=?"这个条件改为"course.id=?"). 但是这样处理总感觉有点怪怪的, 毕竟建了关联但是没用到.
  
请教各位大侠这是什么原因, 应该怎么解决(除以上两种方法外).
   发表时间:2007-08-07  
怎么显示的XML代码这么乱, 多了好多<!--</span-->这个东西. 不知道大家看不看得清...
0 请登录后投票
   发表时间:2007-08-07  
http://www.java2s.com/Code/Java/Hibernate/Relation-One-to-Many.htm

http://www.java2s.com/Code/Java/Hibernate/Relation-Many-to-Many.htm
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics