这里是private Set User=new HashSet(),不时hashMap().这里的classes属性还是一个HashSet对象,其中包含了一个address对象
的引用。那么,当调用session.save(classes)时,Hibernate应该会把HashSet转成“net.sf.hibernate.collection.Set“ 但是在debug 时发现仍然是hashset, 而没有变成Set, 
所以可能出现以上错误,但是这是什么原因呢?怎么改呢?或是有什么地方不多,如果要源码我可以发布上来,希望高手指点!!!!

解决方案 »

  1.   

    把你引入的包的import贴出来。如果你import java.util.Set;那么估计就不会错了,因为java.util.HashSet是这个Set的子类。你的程序中,可能import net.sf.hibernate.collection.Set;它和java.util.HashSet没有任何关系。所以肯定会报ClassCastException.这样说,你能明白吗?最好把你的源代码贴出来,不过我估计,可能就是这个问题!
      

  2.   

    我import是java.util.Set
    我的测试主程序如下:import java.util.HashSet;
    import java.util.Set;
    import org.hibernate.HibernateException;
    import com.test.hibernate.bo.Address;
    import com.test.hibernate.bo.Classes;
    import com.test.hibernate.bo.Course;
    import com.test.hibernate.bo.User;
    import com.test.hibernate.util.HibernateUtil;
    public class StartUp {
           public static void main(String[] args) throws HibernateException {
           
            
            org.hibernate.Session session = HibernateUtil.currentSession();        org.hibernate.Transaction tx= session.beginTransaction();
            
            Address address = new Address();
            address.setCity("Shanghai");
            address.setStreet("road");
            address.setZip("100100");
            
           
           
            User student = new User();
            student.setUserId("2");
            student.setSex("male");
            student.setBirth("222");
            student.setUserName("XiaoMing");
            address.setAddressId(student.getUserId());
            student.setAddress(address);
            
            Set set=new HashSet();
            set.add(student);
                    
            Course course = new Course();
            course.setCourseId("001");
            course.setCourseName("Java");
            course.setUser(set);
            
            
            Classes classes=new Classes();
            classes.setClassId("2");
            classes.setClassName("000000");        classes.setUser(set);
            student.setstClass(classes);
           
            session.save(student);
            session.save(address);
            session.save(course);
            session.save(classes);
          
            tx.commit();        HibernateUtil.closeSession();    }
    }
    course.setUser(set);
    classes.setUser(set);
    要是把以上2句不写(不管是否有外键限制),好像就没什么问题,写了就会出现错误。是什么原因阿?
      

  3.   

    同时我在pojo文件里用 private Set COURSE=new HashSet();也会出现上面的问题, 但是改成 private Set COURSE;就好了,但是在主程序里必须要对变量初始化,而且本人个人认为private Set COURSE=new HashSet();应该是对的,很多书上也是这么用的,为什么我的程序执行不过去呢?谁来帮忙啊?
      

  4.   

    出错信息如下: [java] java.lang.ClassCastException
         [java] at org.hibernate.type.SortedSetType.wrap(SortedSetType.java:49)
         [java] at org.hibernate.event.def.WrapVisitor.processArrayOrNewCollection(WrapVisitor.java:84)
         [java] at org.hibernate.event.def.WrapVisitor.processCollection(WrapVisitor.java:51)
         [java] at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
         [java] at org.hibernate.event.def.WrapVisitor.processValue(WrapVisitor.java:98)
         [java] at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
         [java] at org.hibernate.event.def.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:332)
         [java] at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:250)
         [java] at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
         [java] at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:114)
         [java] at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
         [java] at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
         [java] at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
         [java] at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
         [java] at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
         [java] at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:524)
         [java] at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
         [java] at org.hibernate.impl.SessionImpl.save(SessionImpl.java:510)
      

  5.   

    你的Classes 的user属性是什么类型?Classes是一张表的映射吗?
      

  6.   

    这是我的classes 源码
    public class Classes {
        private String IDF_CLASSID;
        private String IDF_CLASSNAME;
        private Set User;//=new HashSet();
        
        public Classes(){
            
        }
        
        public void setClassId(String id){
            this.IDF_CLASSID=id;
        }
        
        /**@hibernate.id column = "classid"
         * generator-class = "assigned"
         * unsaved-value = "any"
         * type = "string"
         * @return
         */
        public String getClassId(){
            return this.IDF_CLASSID;
        }
       
        public void setClassName(String classname){
            this.IDF_CLASSNAME=classname;
        }    /**@hibernate.property column = "ClassName"
         *type="string"
         * 
         */
        public String getClassName(){
            return this.IDF_CLASSNAME;
        }
      
        public void setUser(Set user){
            this.User=user;
        }
        
        /**@hibernate.set table = "user"
         * cascade = "all"
         * lazy = "false"
         * sort = "unsort"
         * inverse = "true"
         * 
         * @hibernate.collection-key column = "classid"
         * 
         * 
         * @hibernate.collection-one-to-many class = "com.test.hibernate.bo.User"
         * 
         * 
         * @return
         */
        
        public Set getUser(){
            return this.User;
        }
    }
      

  7.   

    private Set User=new HashSet()
      

  8.   

    简单来说 ,Hibernate只支持Set,他会将你的集合 映射转换成Set,所以最好 就定义成  Set myclass=new HashSet();
      

  9.   

    补充以下!
    或者支持hibernate的数据类型
    collection.至于其他的数据类型,不支持!
      

  10.   

    hibernate使用的是自己实现的一套Collection类,这是为了lazy load,透明处理对象关联的持久化(如parent.getChildren().remove(0))之类的需要,但它们确实都实现了java.util包下的Collection,Set,List等容器接口。