数据库为: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请问有人知道是怎么回事吗?帮帮忙!谢谢!!!
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请问有人知道是怎么回事吗?帮帮忙!谢谢!!!
解决方案 »
- 软件授权license到期时间怎么进行修改
- 为什么我招JAVA系统分析师这么难?
- tomcat 上面最多能部署几个网站
- NUTCH能不能支持多机器分布式采集
- 我的mysql是5.0的,我想找一个支持mysql5.0的图形化工具,但是没找到。那位大侠有可以给一份 吗?
- 我连接SQL2000时,JDBC出问题,提示:aq.executeQuery: [Microsoft][SQLServer 2000 Driver for JDBC]End of stream was de tected on a
- 安装apache的一点小问题请教:
- 关于Java的帮助?????
- javamail 折磨人?
- struts登陆问题
- JSP怎么将脚本的内容加到List集合中
- MD5加密 有兴趣的进来
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(标识符组件)是我们对几乎所有应用都推荐使用的方式。
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
如果是手工进行维护,那根据你的配置,符合的id是单独作为一个类来处理,那么可以用以下方式插入数据
OmuserId oid = new oid("userCode的值","comCode的值");
User user = new User();
user.setOmuserId(oid);
//set user的其他属性
session.saveOrUpdate(user);