hibernate中如何解决主键的配置问题?

问题描述

我有A表和B表两个表,B表引用了A表主键作为外键,两个表的主键都不是序列,我在hibernate配置主键id时都设置成<generatorclass="assigned"/>我在执行向B表添加一条记录的时候报了如下错误:ERRORcom.aptech.dao.TDeviceDAO-savefailedorg.hibernate.id.IdentifierGenerationException:idsforthisclassmustbemanuallyassignedbeforecallingsave():com.aptech.pojos.TDevice请问该如何解决??

解决方案

解决方案二:
idsforthisclassmustbemanuallyassigned在保存前要手动指定主键id
解决方案三:
不同的数据库有不同的主键生成方式没有序列你也得选择一个正常的首先LZ你用的什么数据库?
解决方案四:
hibernate配置主键id时都设置成<generatorclass="assigned"/>需要保存对象的时候自己指定主键。
解决方案五:
楼主是什么数据库?
解决方案六:
楼主参考一下
解决方案七:
不同的数据库有不同的主键配置
解决方案八:
引用3楼warison2008的回复:

hibernate配置主键id时都设置成<generatorclass="assigned"/>需要保存对象的时候自己指定主键。

根据你的数据库看一下自己的配置吧……
解决方案九:
是不是因为B中插入数据时引用了A中外键的那个字段在没A中不存在啊
解决方案十:
主键的assigned生成方式由程序自动生成表的主键,即在你的测试程序中要调用setId()方法,且必须在调用save()前调用(或者说在调用save()前必须指定id,其实就是说,主键值不能为空!)。把主键的生成方式改为native,它的特征是能够根据底层数据库自动选择主键生成方式。
解决方案十一:
你可以自定义主键的生成策略类然后在映射文件中配置一下你每次添加的时候,就会根据你自定义的策略给ID赋值
解决方案十二:
你将<generatorclass="assigned"/>中的assigned换成native顶9楼
解决方案十三:
B表引用了A表主键作为外键B表的主键就不能设成<generatorclass="assigned"/>插入时自己指定主键
解决方案十四:
hibernate配置主键id时都设置成<generatorclass="assigned"/>需要保存对象的时候自己指定主键
解决方案十五:
我用的是Oracle数据库,设置成native同样不可以,为了更好的说明,我把两个表的配置粘贴如下:A表:<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--MappingfileautogeneratedbyMyEclipsePersistenceTools--><hibernate-mapping><classname="com.aptech.pojos.Zonghe1"table="ZONGHE1"schema="SCOTT"><idname="FGoodsId"type="java.lang.String"><columnname="F_GOODS_ID"length="20"/><generatorclass="assigned"/></id><propertyname="FGoodsName"type="java.lang.String"><columnname="F_GOODS_NAME"length="50"/></property><propertyname="FPrice"type="java.lang.Double"><columnname="F_PRICE"scale="4"/></property><propertyname="FCount"type="java.lang.Long"><columnname="F_COUNT"precision="22"scale="0"/></property><propertyname="FRemark"type="java.lang.String"><columnname="F_REMARK"length="100"/></property><setname="TDevices"inverse="true"><key><columnname="F_GOODS_ID"length="20"/></key><one-to-manyclass="com.aptech.pojos.TDevice"/></set></class></hibernate-mapping>B表:<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--MappingfileautogeneratedbyMyEclipsePersistenceTools--><hibernate-mapping><classname="com.aptech.pojos.TDevice"table="T_DEVICE"schema="SCOTT"><idname="TId"type="java.lang.String"><columnname="T_ID"length="20"/><generatorclass="assigned"/></id><many-to-onename="zonghe1"class="com.aptech.pojos.Zonghe1"fetch="select"><columnname="F_GOODS_ID"length="20"/></many-to-one><propertyname="TName"type="java.lang.String"><columnname="T_NAME"length="20"/></property><propertyname="TPrice"type="java.lang.Double"><columnname="T_PRICE"precision="18"scale="1"/></property><propertyname="TFrom"type="java.lang.String"><columnname="T_FROM"length="100"/></property></class></hibernate-mapping>
解决方案:
学习。。。
解决方案:
帮助顶顶

时间: 2024-09-17 04:03:10

hibernate中如何解决主键的配置问题?的相关文章

mysql-MySQL 在hibernate中遇到的主键生成问题

问题描述 MySQL 在hibernate中遇到的主键生成问题 最近使用Mysql连hibernate,生成策略为identity,在添加数据的时候遇到问题, 比如添加报销单表和报销明细表(报销单和报销明细是一对多的关系,报销单设置了cascade="all"),每次保存报销单对象数据的时候,会发现上一次保存的报销单里面的报销明细会保存到这一次保存的报销单对象里面. 调试后发现是程序每次都自动给报销单对象的id为上次插入的ID值,然后在真正插入数据库时id+1,报销明细对象跟着就把上次

oracle-刚学的spingmvc 想使用hibernate添加数据实现主键自增?求指点

问题描述 刚学的spingmvc 想使用hibernate添加数据实现主键自增?求指点 <bean id=""dataSource"" class=""org.springframework.jdbc.datasource.DriverManagerDataSource""> <property name=""driverClassName"" value="

oracle数据库表中在没有主键的情况下如何删除重复记录

问题描述 oracle数据库表中在没有主键的情况下如何删除重复记录 数据库表没有主键,没有唯一性约束,如何删除重复记录呢?求大神解答. 解决方案 http://www.cosdiv.com/page/M0/S505/505957.htmlhttp://www.jb51.net/article/35593.htmhttp://www.newhua.com/2012/0106/141377.shtml 上面几篇文章你可以点击进去看看. 如果回答对你有帮助请采纳 解决方案二: delete from

插入操作-DB2 中如何将表中数据复制一份,改变表中一个联合主键的值,

问题描述 DB2 中如何将表中数据复制一份,改变表中一个联合主键的值, 如下: 表A有3个字段是联合主键(非自增长) create table A ( a VARCHAR(20) not null, b VARCHAR(100) not null, c VARCHAR(10) not null, constraint P_Key_1 primary key (a, b, c) ); 表中数据: a b c 1 2 0 1 3 0 如何将表中数据复制一份,改变表中一个联合主键的值,将字段"c&qu

MVC+LINQToSQL的Repository模式之(三)Repository模式实现统一CURD操作,实现EF中的Find主键查找

namespace Data.TEST { /// <summary> /// 数据通用操作实现 /// </summary> /// <typeparam name="TEntity"></typeparam> public class Repository<TEntity> : TESTRepositoryBase, IRepository<TEntity> where TEntity : class,IEnt

Java的Hibernate框架中的双向主键关联与双向外键关联_java

一.双向主键关联双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行<one-to-one>的配置,另外还要在主映射的主键一端采用foreign外键关联属性. 这里同样使用Person和IdCard来讨论,一个人对应着一个唯一的身份证,而且一个身份证也唯一映射着一个人,所以这就产生了双向的关联关系,Person的主键同样也是IdCard的主键,分别是主键的同时也是外键,这种关联关系成为双向一对一映射,表现到关系模型中可如下图: 图中的两个表采用了主

SQLite3中自增主键相关知识总结_SQLite

一.SQLite清空表并将自增列归零 SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容.但SQLite不支持这个语句.在SQLite中直接使用 DELETE FROM TableName 就可以了.对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动. SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:通常在清空表的时候,还需要把自增列归零.在SQLite中定义自增列的方法如下: 复制

Sql Server中如何实现主键由字母数字组成并按照数字自动增长

在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开始每次递加1. 这里要更各位强调一下使用Identity 关键字的前提要求是 数据类型必须为 int ,decimal,bigint,smallint等数值类型. 但是很多时候只有一个数字编号并不能满足我们的要求, 这里笔者的需求就是编号要按照字母加数字的组合,并且字母固定且数字每次递增1. 那么我

hibernate annoation (六 复合主键)

主键类:定义为@Embeddable @Embeddable public class F { private int id; private int id2; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getId2() { return id2; } public void setId2(int id2) { this.id2 = id2; } } 持久化类: