论坛首页 Java企业应用论坛

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

浏览 8634 次
精华帖 (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作的改动也没有能够更新到数据库中,请问

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

   发表时间:2004-01-16  
一个 从数据库中load()出来的对象,和在java虚拟机中创建

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

东东,不知道哪位老大有比较清晰的认识,说出来分享一下吧!
0 请登录后投票
   发表时间: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();;
}
0 请登录后投票
   发表时间:2004-01-16  
我知道这样可以阿, 问题是我必须听老大的, 他让我把load, delete, update这些

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

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

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

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

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

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

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

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

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

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

跳转论坛:
Global site tag (gtag.js) - Google Analytics