求助:Hibernater中双向one-to-one关系的插入问题

star6 2005-07-08 11:13:40
我的简历表(resume)和简历基本信息表(resumebasicinfo)是一对一的关系,resume表中的主键为resumeid,resumebasicinfo中的主键用resume中的主键resumeid。但是在插入时出现"违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字"错误,请高手指教。

========================================================
resume.hbm.xml:

<class
name="com.cyber.cyberhr.model.Resume"
table="RESUME"
schema="CYBERHR"
dynamic-update="true"
>

<id
name="resumeid"
type="java.lang.Long"
column="RESUMEID"
>
<generator class="sequence">
<param name="sequence">seq_resumeid</param>
</generator>
</id>

<property
name="other"
type="java.lang.String"
column="OTHER"
length="2000"
/>
<!-- bi-directional one-to-one association to Resumebasicinfo -->
<one-to-one
name="resumebasicinfo"
class="com.cyber.cyberhr.model.Resumebasicinfo"
cascade="all"
/>
</class>

=================================================================
resumebasicinfo.hbm.xml:

<class
name="com.cyber.cyberhr.model.Resumebasicinfo"
table="RESUMEBASICINFO"
schema="CYBERHR"
dynamic-update="true"
>

<id
name="resumeid"
type="java.lang.Long"
column="RESUMEID"
>
<generator class="foreign">
<param name="property">resume</param>
</generator>
</id>

<property
name="namepart1"
type="java.lang.String"
column="NAMEPART1"
length="10"
/>
......
<!-- bi-directional one-to-one association to Resume -->
<one-to-one
name="resume"
class="com.cyber.cyberhr.model.Resume"
constrained="true"
/>
</class>

=============================================================
我的代码:

Resume resume = new Resume();
resume.setOther(otherInfo);
Resumebasicinfo basicinfo = new Resumebasicinfo();
basicinfo.setNamepart1(namePart1);

Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
basicinfo.setResume(resume);
resume.setResumebasicinfo(basicinfo);
Long generatedID = (Long)session.save(resume);
session.flush();
tx.commit();
}catch(Exception ex){
log.error(ex.getMessage());
}


==============================================================

...全文
269 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangw1319 2005-07-11
  • 打赏
  • 举报
回复
换一种一对一的方式试一下:

把 resume.hbm.xml里的
<one-to-one
name="resumebasicinfo"
class="com.cyber.cyberhr.model.Resumebasicinfo"
cascade="all"
/>
该成
<many-to-one
name="resumebasicinfo"
class="com.cyber.cyberhr.model.Resumebasicinfo"
unique="true"
/>



把resumebasicinfo.hbm.xml里的
<one-to-one
name="resume"
class="com.cyber.cyberhr.model.Resume"
constrained="true"
/>
该成
<one-to-one
name="resume"
class="com.cyber.cyberhr.model.Resume"
property-ref="resumebasicinfo"
/>


star6 2005-07-10
  • 打赏
  • 举报
回复
在我的应用中,resume和resumeinfo确实是双向一对一的关系,resume中存放简历的概要信息,而resumeinfo中存放简历的详细信息,他们之间是一对一的关系,是概要信息和详细信息间的对应关系。
Saro 2005-07-10
  • 打赏
  • 举报
回复
双向一对一?
1.主键谁依赖谁?
2.一个Employee是一个Person,一个Person就一定是一个Employee?
didoleo 2005-07-10
  • 打赏
  • 举报
回复
感觉好象不是hbm.xml的问题(你的hbm.xml有省略的地方,不知道有什么问题),会不会你的resume或resumenfo和其他的表的主键有引用关系,而你的程序当中没有实例化那个"东东",比如说ACCOUNTID还没生成(只是猜测)。
star6 2005-07-09
  • 打赏
  • 举报
回复
谢谢大伙捧场:)

To: usherlight(xingtian)
我查过了,好像在one-to-one关系中没有inverse的属性。

To: fengyun1314(追梦)
我已经在数据库中定义了resume和resumeinfo间的关联关系,resumeinfo中的主键字段resumeid是通过外键引用resume中的主键字段resumeid的,关联映射默认的应该是以主键字段关联的吧
如果用单项关联的话,我就不能通过resumeinfo得到resume的信息了,能用双向关联实现吗

To: wangw1319(于风)
one-to-one里的name属性指的是对应的表的名称,应该不是这里的问题。建立映射时默认的是采用主键进行关联。

==================================================
大家还有没有其他的办法,我搞了好长时间都没有搞定,郁闷死了:(
wangw1319 2005-07-09
  • 打赏
  • 举报
回复
constrained="true"告訴Hibernate參考至resume表的主鍵
你在resumebasicinfo.hbm.xml里
<one-to-one
name="resume"
class="com.cyber.cyberhr.model.Resume"
constrained="true"
/>
resume是不是跟resume表里的主键没什么关系所以导致"未找到父项关键字"错误
fengyun1314 2005-07-09
  • 打赏
  • 举报
回复
这种情况单向关联就可以了
fengyun1314 2005-07-09
  • 打赏
  • 举报
回复
当然是hbm.xml有问题了,他们表之间的关联是靠关键字段的,你都没有给出关联的关键字段!!
usherlight 2005-07-09
  • 打赏
  • 举报
回复
似乎应该在resumebasicinfo中指定inverse=false
star6 2005-07-08
  • 打赏
  • 举报
回复
(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
at java.lang.Thread.run(Thread.java:534)
40569 [http8080-Processor24] ERROR net.sf.hibernate.impl.SessionImpl - Could not synchronize database state with session
net.sf.hibernate.JDBCException: Could not execute JDBC batch update
at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:133)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2421)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2371)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
at com.cyber.cyberhr.resume.AddBasicinfoAction.doAddBasicinfo(AddBasicinfoAction.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.cyber.base.struts.BaseAction.process(BaseAction.java:87)
at com.cyber.base.struts.BaseAction.execute(BaseAction.java:50)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.sql.BatchUpdateException: ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:458)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54)
at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:126)
... 40 more
40639 [http8080-Processor24] ERROR com.cyber.cyberhr.resume.AddBasicinfoAction - Could not execute JDBC batch update

================================================================================

是不是我的hbm.xml配置有问题,请各位指教,谢谢!
star6 2005-07-08
  • 打赏
  • 举报
回复
出错信息:

Hibernate: select seq_resumeid.nextval from dual
Hibernate: insert into CYBERHR.RESUME (OTHER, LANG, ACCOUNTID, RESUMEID) values (?, ?, ?, ?)
Hibernate: insert into CYBERHR.RESUMEBASICINFO (NAMEPART1, NAMEPART2, SEX, BIRTHDATE, IDNUMBER, EMAIL, XUELI, SALARYPERYEAR, WORKYEAR, LIVINGCITY, HUKOU, MARRIAGESTATUS, TELEPHONEHOME, MOBILE, PAGER, FAX, ADDRESS, POSTCODE, HOMEPAGE, VACANCYID, RESUMEID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
40358 [http8080-Processor24] WARN net.sf.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
40369 [http8080-Processor24] ERROR net.sf.hibernate.util.JDBCExceptionReporter - ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

40369 [http8080-Processor24] WARN net.sf.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
40379 [http8080-Processor24] ERROR net.sf.hibernate.util.JDBCExceptionReporter - ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

40429 [http8080-Processor24] WARN net.sf.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
40449 [http8080-Processor24] ERROR net.sf.hibernate.util.JDBCExceptionReporter - ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

40449 [http8080-Processor24] WARN net.sf.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
40459 [http8080-Processor24] ERROR net.sf.hibernate.util.JDBCExceptionReporter - ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

40519 [http8080-Processor24] ERROR net.sf.hibernate.util.JDBCExceptionReporter - Could not execute JDBC batch update
java.sql.BatchUpdateException: ORA-02291: 违反完整约束条件 (CYBERHR.RESUMEBASICIN_FK51110442457883) - 未找到父项关键字

at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:458)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54)
at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:126)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2421)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2371)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
at com.cyber.cyberhr.resume.AddBasicinfoAction.doAddBasicinfo(AddBasicinfoAction.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.cyber.base.struts.BaseAction.process(BaseAction.java:87)
at com.cyber.base.struts.BaseAction.execute(BaseAction.java:50)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext
Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.无参构造 2.静态工厂 3.实例工厂 管理对象 对象关系DI 构造器注入 set注入 生命周期 scope:prototype/singleton init-method destroy-method API BeanFactory:使用这个工厂创建对象的方式都是懒加载,在调用的时候再创建 ClassPathXmlApplicationContext:使用这个工厂创建对象,他会根据scope智能判断是否懒加载,如果是单例则创建容器时就会创建里面bean的实例,如果是多例在获取使用时才会创建bean实例 FileSystemXmlApplicationContext磁盘路径 AnnotationConfigApplicationContext注解 WebApplicationContext:web环境使用的容器 注解 创建对象 Component:不分层的注解 Controller:web层 Service:service层 Repository:dao层 管理对象 注入 AutoWired Qualifier Resource Value 声明周期 Scope PostConstruct PreDestroy 新注解 Bean:写方法上,将方法的返回值 Configuration:标记配置类 ComponentScan包扫描 PropertySource:加载配置文件 Import:导入其他配置类 AOP 概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 连接点JoinPoint:目标可被增强的方法 切入点PointCut:被增强的方法 增强Advice:增强代码 切面Aspect:切点加通知 织入weaving:讲切面加载进内存形成代理对象的过程 代理Proxy 底层实现 JDK动态代理(默认) 基于接口:代理对象与目标对象是兄弟关系,目标类必须实现接口 CGLIB动态代理 基于父类:代理对象与目标对象是父子关系.目标不能被final修饰 修改默认代理方法: 增强种类 前置通知 后置通知 异常通知 最终通知 环绕通知 注意:使用注解的方式,最终通知和后置通知顺序换了,建议使用环绕通知 注解 配置 声明式事务管理 PlatFormTransactionManager:平台事务管理器:定义了commit/rollback Mybatis/jdbc:DataSourceTransactionManager Hibernater:HibernaterTransactionManager TransactionManagerDifinition 传播行为:A-->B,在B上声明是否一定需要事务管理 requerd:必须的(默认),如果A有事务那么就加入A的事务,如果A没有事务那么单独创建一个事务 supports,如果A有事务则加入,如果没有就算了 隔离级别 default:使用数据库默认的隔离级别(mysql:可重复读,oracle:读已提交) readuncommited:读未提交,不可以解决任何问题 readcommited:读已提交,可以解决脏读问题 repeatableRead:可重复读,可以解决脏读,不可重复读问题 Serializbler:串行化,可以解决所有问题 超时时间: 默认-1(永不超时),事务一直不提交也不回滚的时间 是否只读: 默认false TransactionManagerStatus: 事务的一些状态 整合 Spring整合Junit 1.导入依赖spring-test 2.加注解:RunWith、ContextConfiguration 3.注入对象进行测试 Spring整合web 1.导入依赖spring-web 2.配置ContextLoadListener 3.配置 contextConfigLocation classpath:applicationContext.xml 4.在Servlet使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧