数据库为:mysql,数据库表:user,主键为usercode和comcode
hibernate的配置文件user.hbm.xml如下:
<class name="com.oms.bean.user" table="user" catalog="omsdb">
        <composite-id name="id" class="com.oms.bean.OmuserId">
            <key-property name="userCode" type="java.lang.String">
                <column name="UserCode" length="10" />
            </key-property>
            <key-property name="comCode" type="java.lang.String">
                <column name="ComCode" length="10" />
            </key-property>
            
        </composite-id>
报错:org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.oms.bean.user请问有人知道是怎么回事吗?帮帮忙!谢谢!!!

解决方案 »

  1.   

    ids for this class must be manually assigned 这个类的标识必须手动分配主键咋回事? 自动增长?
      

  2.   

    这个表有两个主键,所以用<composite-id>这个元素!有人知道吗?帮帮忙!谢谢!!!
      

  3.   

    <generator class="assigned" />
      

  4.   


    5.1.5. composite-id
    <composite-id
            name="propertyName"
            class="ClassName"
            mapped="true|false"
            access="field|property|ClassName"
            node="element-name|."
            >        <key-property name="propertyName" type="typename" column="column_name"/>
            <key-many-to-one name="propertyName class="ClassName" column="column_name"/>
            ......
    </composite-id>
    如果表使用联合主键,你可以映射类的多个属性为标识符属性。 <composite-id>元素接受<key-property> 属性映射和<key-many-to-one>属性映射作为子元素。 <composite-id>
            <key-property name="medicareNumber"/>
            <key-property name="dependent"/>
    </composite-id>
    你的持久化类必须重载equals()和 hashCode()方法,来实现组合的标识符的相等判断。 实现Serializable接口也是必须的。 不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外, 没有什么方便的“把手”可用。你必须初始化持久化类的实例,填充它的标识符属性,再load() 组合关键字关联的持久状态。我们把这种方法称为embedded(嵌入式)的组合标识符,在重要的应用中不鼓励使用这种用法。 第二种方法我们称为mapped(映射式)组合标识符 (mapped composite identifier),<composite-id>元素中列出的标识属性不但在持久化类出现,还形成一个独立的标识符类。 <composite-id class="MedicareId" mapped="true">
            <key-property name="medicareNumber"/>
            <key-property name="dependent"/>
    </composite-id>
    在这个例子中,组合标识符类MedicareId和实体类都含有medicareNumber和dependent属性。标识符类必须重载equals()和hashCode()并且实现Serializable接口。这种方法的缺点是出现了明显的代码重复。 下面列出的属性是用来指定一个映射式组合标识符的: mapped (可选, 默认为false): 指明使用一个映射式组合标识符,其包含的属性映射同时在实体类和组合标识符类中出现。 class (可选,但对映射式组合标识符必须指定): 作为组合标识符类使用的类名. 在第 8.4 节 “组件作为联合标识符(Components as composite identifiers)”一节中,我们会描述第三种方式,那就是把组合标识符实现为一个组件(component)类,这是更方便的方法。下面的属性仅对第三种方法有效: name (可选,但对这种方法而言必须): 包含此组件标识符的组件类型的名字 (参阅第9章). access (可选 - 默认为property): Hibernate应该使用的访问此属性值的策略 class (可选 - 默认会用反射来自动判定属性类型 ): 用来作为组合标识符的组件类的类名(参阅下一节) 第三种方式,被称为identifier component(标识符组件)是我们对几乎所有应用都推荐使用的方式。 
      

  5.   

    OmuserId--先构建这个对象,然后存入user
      

  6.   

    com.oms.bean.OmuserId 先将他查询出来吧 然后整个放到user里 那个String类型的应该是类似流水号之类的东西吧 他俩一起放 
      

  7.   

         应该是少了这句话 <generator class="native" />
        IdentifierGenerationException --> 标识符生成异常             这主要的问题就是处在 com.oms.bean.user这个类的对应的 映射文件上.  user.hbm.xml :   它的 <id> 一定有异常,  而且   ids for this class must be manually assigned before calling save():  这里也说明了,            "ids" 就是id 出了问题 ,  <id> 是映射了相应数据库表的主键字段, 对其子元素<generator class="">,其中class的取值可以为increment、identity、sequence、hilo、native......等,更多的可参考hibernate参考文档,一般取其值为native 。                        在MySQl , MS SQL Server , 和 Oracle 数据库中都可以使用native  , 跨平台的也是使用 native  ,   在 <generator class="native" /> 这样写的话就是把 id的管理交给了数据库自己定义 . 我这里之所以就是生成的TblUser.hbm.xml 文件 没有经过修改就直接使用了 , 里面的  <generator class="默认的" />我想改成native 就可以了.
    所以在代码的第五行加上这句话就OK了。
    改改试试
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tjzero_sapce/archive/2009/03/02/3950469.aspx
      

  8.   

    您好,我把<generator class="native" />这个加上去之后,jsp有错,好像在<composite-id>元素下不能使用<generator>这个元素。请问您知道是怎么回事吗?谢谢!!!
      

  9.   

    你的主键不应该用数据库默认的生成策略(native)
      

  10.   

    映射配置文件没什么问题,你应该把如何save的那段代码贴出来。你的复合逐渐有没有生成策略?还是是手工进行维护。
    如果是手工进行维护,那根据你的配置,符合的id是单独作为一个类来处理,那么可以用以下方式插入数据
    OmuserId oid = new oid("userCode的值","comCode的值");
    User user = new User();
    user.setOmuserId(oid);
    //set  user的其他属性
    session.saveOrUpdate(user);