论坛首页 Java版 Hibernate

一个关于PO和JOPO操作的问题.

浏览 3952 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-01-15
[code:1] 一个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作的改动也没有能够更新到数据库中,请问

这样可以吗, 还是我策操作或者配置有问题.

[/code:1]
   
最后更新时间:2004-01-16
一个 从数据库中load()出来的对象,和在java虚拟机中创建

的对象是不一样,ibernate会在PO中加入一些它自己识别的

东东,不知道哪位老大有比较清晰的认识,说出来分享一下吧!
   
0 请登录后投票
最后更新时间:2004-01-16
你的做法完全错了
更新时你可以按照下面的模式做:
启动事务-->载入需要更新的对象-->修改对象的属性-->提交事务
[code:1]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();
}[/code:1]
   
0 请登录后投票
最后更新时间:2004-01-16
[code:1]我知道这样可以阿, 问题是我必须听老大的, 他让我把load, delete, update这些

hibernate已经对JDBC做了封装的操作再在自己的代码中作一层封装, 然后提供给上层

的开发人员用, 这时我在封装中肯定已经将session关闭了,所以 每次我都还要在开或

者把对象和一个 session在联系在一起, 我觉得这样作不对, 但我也没有办法, 所以才会

想出了上面的办法, 我做过实验了,refresh之后,这个对象是可以正确的被处理的,但是

他的孩子不会在级联时被处理, 除非也refresh一下, 但是就是说一个新建的不能被

refresh的, 我知道hibernate使用CGLIB对对象做了处理,动态转换为字节码,但是不知

道这样作为什么不可以,我觉得逻辑上没有问题阿?

[/code:1]
   
0 请登录后投票
最后更新时间:2004-01-16
你这样肯定是不对的,你可以看看Session.refresh()是什么意思!!
   
0 请登录后投票
最后更新时间:2004-01-16
[code:1]   那如果不管这个refresh的问题, 现在我有一个father ,我把他 从数据库中

load上来, 然后session, 然后 有对father 和他的child做了修改,并且加入了新的child,

现在我怎样作才能把这个father的更新反映到数据库中呢?[/code:1]
   
0 请登录后投票
最后更新时间:2004-01-16
不好意思, father被load上来后, 然后 session关闭,
   
0 请登录后投票
最后更新时间:2004-01-16
Session.update()或Session.saveOrUpdate()喽,不过像你这样效率很低的。
   
0 请登录后投票
最后更新时间:2004-01-16
不对阿, 这样我当然试过了,可是会有异常的.
   
0 请登录后投票
最后更新时间:2004-01-16
[code:1](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[/code:1]
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐