锁定老帖子 主题:一个关于PO和JOPO操作的问题.
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-01-15
一个PO是应该和一个打开的session联系在一起的, 现在我有个例子,一个 father ,多个child,他们之间是一对多的关系, 现在在数据库中有一条father和两条属于 他的child, 现在我在程序中构造了一个father对象,他的所有属性包括id都是我给的,并 且和数据库中的所有数据是一样的, 同时我构造了和数据库中的数据一样的child,并把 这个child加到了father 中, 我有新建了一个新的child对象, 这个对象应该是要被插入到 数据库中的,也加到了father 中, 我把father和child之间的cacsde=all, 开了一个session, session.refresh( father);, 然后 session.update(father );, 但是这个新建的child 并没有 被插入到数据库中,我对第一个建的child作的改动也没有能够更新到数据库中,请问 这样可以吗, 还是我策操作或者配置有问题. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-01-16
一个 从数据库中load()出来的对象,和在java虚拟机中创建
的对象是不一样,ibernate会在PO中加入一些它自己识别的 东东,不知道哪位老大有比较清晰的认识,说出来分享一下吧! |
|
返回顶楼 | |
发表时间:2004-01-16
你的做法完全错了 。
更新时你可以按照下面的模式做: 启动事务-->载入需要更新的对象-->修改对象的属性-->提交事务 Session session=...; Transaction tx=null; try{ tx=session.beginTransaction();; //---------------------------------------- Father father=(Father);session.get(Father.class,fatherId);; if(father==null);{ throw new FatherNotFoundException();; } //modify father... father.setName(...);; Child oldChild=(Child);father.getChildren();.get(0);; //modify old child... oldChild.setName(...);; //add new child Child newChild=new Child();; newChild.setName(...);; father.getChildren();.add(newChild);; //child.setFather(father);;//如果是双向的 //---------------------------------------- session.flush();; tx.commit();; }catch(Exception e);{ if(tx!=null);{ tx.rollback();; } throw e; }finally{ session.close();; } |
|
返回顶楼 | |
发表时间:2004-01-16
我知道这样可以阿, 问题是我必须听老大的, 他让我把load, delete, update这些 hibernate已经对JDBC做了封装的操作再在自己的代码中作一层封装, 然后提供给上层 的开发人员用, 这时我在封装中肯定已经将session关闭了,所以 每次我都还要在开或 者把对象和一个 session在联系在一起, 我觉得这样作不对, 但我也没有办法, 所以才会 想出了上面的办法, 我做过实验了,refresh之后,这个对象是可以正确的被处理的,但是 他的孩子不会在级联时被处理, 除非也refresh一下, 但是就是说一个新建的不能被 refresh的, 我知道hibernate使用CGLIB对对象做了处理,动态转换为字节码,但是不知 道这样作为什么不可以,我觉得逻辑上没有问题阿? |
|
返回顶楼 | |
发表时间:2004-01-16
你这样肯定是不对的,你可以看看Session.refresh()是什么意思!!
|
|
返回顶楼 | |
发表时间:2004-01-16
那如果不管这个refresh的问题, 现在我有一个father ,我把他 从数据库中 load上来, 然后session, 然后 有对father 和他的child做了修改,并且加入了新的child, 现在我怎样作才能把这个father的更新反映到数据库中呢? |
|
返回顶楼 | |
发表时间:2004-01-16
不好意思, father被load上来后, 然后 session关闭,
|
|
返回顶楼 | |
发表时间:2004-01-16
Session.update()或Session.saveOrUpdate()喽,不过像你这样效率很低的。
|
|
返回顶楼 | |
发表时间:2004-01-16
不对阿, 这样我当然试过了,可是会有异常的.
|
|
返回顶楼 | |
发表时间:2004-01-16
(util.JDBCExceptionReporter 38 ); SQL Error: 1, SQLState: 23000 (util.JDBCExceptionReporter 46 ); ORA-00001: unique constraint (SYSTEM.SYS_C002698); violated Exception in thread "main" (util.JDBCExceptionReporter 38 ); SQL Error: 1, SQLState: 23000 (util.JDBCExceptionReporter 46 ); ORA-00001: unique constraint (SYSTEM.SYS_C002698); violated (util.JDBCExceptionReporter 38 ); Could not execute JDBC batch update java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.SYS_C002698); violated at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168); at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208); at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543); at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405); at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:822); at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446); at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371); at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:2883); at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54); at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:118); at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2309); at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2259); at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2185); at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61); at asset.domain.manager.AssosiationDemoManager.createWife(AssosiationDemoManager.java:59); at asset.domain.Asset.testAssosiation(Asset.java:125); at asset.domain.Asset.main(Asset.java:41); (impl.SessionImpl 2267); 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:125); at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2309); at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2259); at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2185); at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61); at asset.domain.manager.AssosiationDemoManager.createWife(AssosiationDemoManager.java:59); at asset.domain.Asset.testAssosiation(Asset.java:125); at asset.domain.Asset.main(Asset.java:41); Caused by: java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.SYS_C002698); violated at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168); at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208); at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:543); at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405); at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:822); at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446); at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371); at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:2883); at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54); at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:118); ... 7 more |
|
返回顶楼 | |