`

再说inverse=true

阅读更多
java 代码
  1. 建议大家好好去看一下这个链接,讲的很详细,虽然是E文,可并不难懂。    
  2. http://www.hibernate.org/155.html    
  3.   
  4. 这篇文章里没有提到delete的情况,我就one-to-many来做个简单说明:    
  5.   
  6.   
  7. 代码   
  8.     
  9. Parent parent = (Parent) session.load(Parent.class, pid);   
  10. session.delete(parent);   
  11.   
  12. 1. 爸爸那边设置了cascade=all和inverse=true    
  13. a. delete from children    
  14. b. delete from parent   
  15.   
  16. 2. 爸爸那边设置了cascade=all,没有设inverse=true    
  17. a. update children set parent_id=null where parent_id=?    
  18. b. delete from children    
  19. c. delete from parent   
  20.   
  21. 因为此时inverse=false,所以爸爸要负责维护relationship,所以它要去把children中的连接信息都清空。但是,如果children的parent_id的constraint设置的是not-null的话,那么很不幸,hibernate执行到2.a就会throw exception了。   
  22.   
  23. 如果你要问,这个inverse=true到底是在源代码中的哪儿判断的呀?请看代码:    
  24.   
  25.   
  26. 代码   
  27.     
  28. ......   
  29.   
  30. SessionImpl.flush();   
  31.   
  32. SessionImpl.execute();   
  33.   
  34. SessionImpl.executeAll(collectionRemovals);   
  35.     executable.execute();   
  36.   
  37. ScheduledCollectionRemove.execute();   
  38.     getPersister().remove( getId(), getSession() );   
  39.   
  40. OneToManyPersister(即AbstractCollectionPersister).remove();   
  41.     if ( !isInverse ) {   
  42.         PreparedStatement st = session.getBatcher().prepareBatchStatement( getSQLDeleteString() );   
  43.     }   
  44.   
  45. OneToManyPersister.getSQLDeleteString();   
  46.     return "update children set parent_id=null where parent_id=?";   
  47.   
  48. ......   
  49.   
  50.     
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics