<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>涂0实验室 &#187; cascade</title>
	<atom:link href="http://www.sulong.info/archives/tag/cascade/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sulong.info</link>
	<description>一个程序员的成长之路</description>
	<lastBuildDate>Fri, 27 Aug 2010 01:54:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>hibernate中的inverse和cascade的区别</title>
		<link>http://www.sulong.info/archives/48</link>
		<comments>http://www.sulong.info/archives/48#comments</comments>
		<pubDate>Wed, 05 Dec 2007 14:06:32 +0000</pubDate>
		<dc:creator>sulong</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[cascade]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[inverse]]></category>

		<guid isPermaLink="false">http://www.sulong.info/archives/48</guid>
		<description><![CDATA[１、到底在哪用cascade=&#8221;&#8230;&#8221;？ cascade属性并不是多对多关系一定要用的，有了它只是让我们在插入或删除对像时更方便一些，只要在cascade的源头上插入或是删除，所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的 cascade，unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update，如果这个对象的id是unsaved-value的话，那说明这个对象不是persistence object要save（insert)；如果id是非unsaved-value的话，那说明这个对象是persistence object（数据库中已存在），只要update就行了。saveOrUpdate方法用的也是这个机制。 ２、到底在哪用inverse=&#8221;ture&#8221;? inverse属性默认是false的，就是说关系的两端都来维护关系。这个意思就是说，如有一个Student, Teacher和TeacherStudent表，Student和Teacher是多对多对多关系，这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢？在用hibernate时，我们不会显示的对 TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是&#8221;谁&#8221;维护关系，那个在插入或删除&#8221;谁&#8221;时，就会处发对关系表的操作。前提是&#8221;谁&#8221;这个对象已经知道这个关系了，就是说关系另一头的对象已经set 或是add到&#8221;谁&#8221;这个对象里来了。前面说过inverse默认是false，就是关系的两端都维护关系，对其中任一个操作都会处发对表系表的操作。当在关系的一头，如Student中的bag或set中用了inverse＝&#8221;true&#8221;时，那就代表关系是由另一关维护的（Teacher）。就是说当这插入Student时，不会操作TeacherStudent表，即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以，当关系的两头都用inverse=&#8221;true&#8221;是不对的，就会导致任何操作都不处发对关系表的操作。当两端都是 inverse=&#8221;false&#8221;或是default值是，在代码对关系显示的维护也是不对的，会导致在关系表中插入两次关系。 在一对多关系中inverse就更有意义了。在多对多中，在哪端inverse=&#8221;true&#8221;效果差不多（在效率上）。但是在一对多中，如果要一方维护关系，就会使在插入或是删除&#8221;一&#8221;方时去update&#8221;多&#8221;方的每一个与这个&#8221;一&#8221;的对象有关系的对象。而如果让&#8221;多&#8221;方面维护关系时就不会有update 操作，因为关系就是在多方的对象中的，直指插入或是删除多方对象就行了。当然这时也要遍历&#8221;多&#8221;方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说，还是让&#8221;多&#8221;方维护关系更直观一些。]]></description>
			<content:encoded><![CDATA[<p><strong>１、到底在哪用cascade=&#8221;&#8230;&#8221;？</strong><br />
cascade属性并不是多对多关系一定要用的，有了它只是让我们在插入或删除对像时更方便一些，只要在cascade的源头上插入或是删除，所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的 cascade，unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update，如果这个对象的id是unsaved-value的话，那说明这个对象不是persistence object要save（insert)；如果id是非unsaved-value的话，那说明这个对象是persistence object（数据库中已存在），只要update就行了。saveOrUpdate方法用的也是这个机制。<br />
<strong>２、到底在哪用inverse=&#8221;ture&#8221;?</strong><br />
inverse属性默认是false的，就是说关系的两端都来维护关系。这个意思就是说，如有一个Student, Teacher和TeacherStudent表，Student和Teacher是多对多对多关系，这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢？在用hibernate时，我们不会显示的对 TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是&#8221;谁&#8221;维护关系，那个在插入或删除&#8221;谁&#8221;时，就会处发对关系表的操作。前提是&#8221;谁&#8221;这个对象已经知道这个关系了，就是说关系另一头的对象已经set 或是add到&#8221;谁&#8221;这个对象里来了。前面说过inverse默认是false，就是关系的两端都维护关系，对其中任一个操作都会处发对表系表的操作。当在关系的一头，如Student中的bag或set中用了inverse＝&#8221;true&#8221;时，那就代表关系是由另一关维护的（Teacher）。就是说当这插入Student时，不会操作TeacherStudent表，即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以，当关系的两头都用inverse=&#8221;true&#8221;是不对的，就会导致任何操作都不处发对关系表的操作。当两端都是 inverse=&#8221;false&#8221;或是default值是，在代码对关系显示的维护也是不对的，会导致在关系表中插入两次关系。<br />
在一对多关系中inverse就更有意义了。在多对多中，在哪端inverse=&#8221;true&#8221;效果差不多（在效率上）。但是在一对多中，如果要一方维护关系，就会使在插入或是删除&#8221;一&#8221;方时去update&#8221;多&#8221;方的每一个与这个&#8221;一&#8221;的对象有关系的对象。而如果让&#8221;多&#8221;方面维护关系时就不会有update 操作，因为关系就是在多方的对象中的，直指插入或是删除多方对象就行了。当然这时也要遍历&#8221;多&#8221;方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说，还是让&#8221;多&#8221;方维护关系更直观一些。</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.sulong.info/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.sulong.info/archives/48/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
