public static void main(String[] args) {
// TODO Auto-generated method stub
SessionFactory fac = HibernateSessionFactory.getSessionFactory();
Session session = fac.openSession();
session.beginTransaction();
Treetypeinfo ti = new Treetypeinfo();
ti.setTid(2);
//Treetypeinfo跟Tree是多对一关系
Tree t = new Tree();
t.setTreetypeinfo(ti);
t.setDisplayname("sfsd");
//TreeDa跟Tree是外键的1对1关系
TreeDa td = new TreeDa();
td.setTableName("test");
td.setTree(t);
t.setTreeDa(td);
session.save(t);
session.beginTransaction().commit();
session.close();
}我在Tree里面配置TreeDa是这样的<one-to-one name="treeDa" property-ref="tree" cascade="save-update"></one-to-one>然后运行报错:Hibernate: select
treecode
.nextval from dual
Hibernate: select
treedacode
.nextval from dual
Hibernate: insert into TREE (TID, displayname, rootcode, id) values (?, ?, ?, ?)
Hibernate: insert into treeda (tid, tableName, id) values (?, ?, ?)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.aisino.tree.test.Test.main(Test.java:31)
Caused by: java.sql.BatchUpdateException: ORA-02291: 违反完整约束条件 (TEST.引用TREE表) - 未找到父项关键字 at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10768)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
... 8 more
如果Tree插入成功假如他的id为1,但是在级联插入TreeDa的时候Tree的编号就变为2了,所以报错未找到父项关键字,就是外键引用报错,高手们求救啊,急!急!急!急!急!急!
解决方案 »
- 一个J2EE初学者的困惑
- hibernate缓存机制的问题
- hibernate +struts2问题!!!
- 求查找替换最高效率算法
- 百分求助:如何通知JAVA程序获得Weblogic服务器的上可用线程、等待队列、连接池的连接数及JTA数
- struts2校验框架问题
- struts中下拉列表的onchang事件执行actiong的用法100分
- Hibernate 子查询.
- 求Java DOM生成某XML文件代码。。。
- 新手初学Java,前辈们给推荐一下好的J2EE的入门书 ^_^
- Caused by: org.hibernate.MappingException: Unknown entity:异常
- Oracle中的字段类型为CLOB的数据导出
我尝试过用2个方法分别去保存,首先保存session.save(tree)保存成功那么就会产生主键吧?如果此时的主键是1的话,那么我再td.setTree(tree)这个时候再session.save(td),那么tree的id主键变成2了,就是这个问题不晓得怎么回事
怎么感觉是sequence的问题?id自动增加了?
个人感觉insert 的时候用sequence不当
<many-to-one name="tree" class="包名.类名" unique="true" column="tid"/>
少个 column配置吧
这样保存 那么 TreeDa表的 Tid就是空值(引用Tree的外键 )
那么你的表Tree和TreeData应该是双向关联的吧
把你完整的hbm文件贴出来吧
<hibernate-mapping>
<class name="TreeDa" table="treeda">
<id name="id">
<generator class="sequence">
<param name="sequence">
treedacode
</param>
</generator>
</id>
<many-to-one name="tree" unique="true" class="Tree" column="tid"/>
<property name="tableName"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="Tree" table="TREE">
<id name="id">
<generator class="sequence">
<param name="sequence">
treecode
</param>
</generator>
</id>
<many-to-one name="treetypeinfo" class="com.aision.tree.entity.Treetypeinfo">
<column name="TID" />
</many-to-one>
<one-to-one name="treeDa" property-ref="tree" class="TreeDa" cascade="save-update"></one-to-one>
<property name="displayname"/>
<property name="rootcode"/>
</class>
</hibernate-mapping>配置文件贴出来了 ,包名我省略了
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
SessionFactory fac = HibernateSessionFactory.getSessionFactory();
Session session = fac.openSession();
session.beginTransaction();
Treetypeinfo ti = new Treetypeinfo();
ti.setTid(2);
//Treetypeinfo跟Tree是多对一关系
Tree t = new Tree();
t.setTreetypeinfo(ti);
t.setDisplayname("sfsd");
//TreeDa跟Tree是外键的1对1关系
TreeDa td = new TreeDa();
td.setTableName("test");
t.setTreeDa(td);
session.save(t); session.beginTransaction().commit();
session.close(); }配置文件如上,然后执行这代码,TreeDa表的Tid外键列的值为空,怎么回事呢?