1. 程式人生 > >hibernate幾個關鍵字的一點點用法心得

hibernate幾個關鍵字的一點點用法心得

在多表操作中hibernate是一個很實用的框架,單表就用JDBC,C3P0就行了,沒必要使用框架,框架執行還是比較遲鈍的,涉及到資料庫操作無非便是增刪改查CRUD,下面我就簡單記錄一下,反正我能看懂會用就可以了

1,inverse,這個在xml的配置檔案中,經過操作,發現刪除跟inverse的設定似乎根本就沒有關係一樣,但是對於其他諸如新增還是很重要的,後面會附上幾個檔案以備看到的人測試用,我的總結是:inverse配置在誰那裡,誰就有權利去修改資料庫。簡單來說,多對多的兩張表,擦!說不明白,上程式碼吧:

    a,在user表中設定inverse(true),role表中不設定inverse(false)

user表:
<set name="roles" table="sys_user_role" inverse="true" cascade="all" lazy="extra">
			<key column="user_id"/><!--配置的是該物件在中間表的外來鍵  -->
			
			<!--class值得是屬性中的變數型別    column值得是class類在中間表的外來鍵  -->
			<many-to-many class="cn.itcast.entity.RoleInfo" column="role_id"/>
		
		</set>
role表:
<set name="users"  table="sys_user_role" cascade="all" >
			<key column="role_id"/>
			<many-to-many class="cn.itcast.entity.UserInfo" column="user_id"/>
		
		</set>

那麼操作的時候,如果想要執行成功,那麼如下操作是可以成功的,但是將儲存的物件換成是role的就會報錯

ConstraintViolationException: could not execute statement: fuck!i hate this!!!!!

                        Transaction tx = session.beginTransaction();
		
			/*session.save(r1);
			session.save(r2);
			session.save(r3);*/
			
			session.save(user1);
			session.save(user2);
			tx.commit();
			System.out.println("儲存成功!");

    b,那你說兩個都設定成inverse(true)行不行呢?可以的!reverse完

2,cascade,這個屬性很重要,畢竟在設計到JPA這個屬性也是很中要的,解釋一下,它的意思是串聯的意思,不設定,那兩個物件就跟表的RM(關聯)關係建立不起來,一般來講,增加修改這類操作跟著inverse跑基本上就沒有問題了,如下:

user表
<set name="roles" table="sys_user_role" inverse="true" lazy="extra" cascade="all">
			<key column="user_id"/><!--配置的是該物件在中間表的外來鍵  -->
			
			<!--class值得是屬性中的變數型別    column值得是class類在中間表的外來鍵  -->
			<many-to-many class="cn.itcast.entity.RoleInfo" column="role_id"/>
		
		</set>
role表
<set name="users"  table="sys_user_role"  >
			<key column="role_id"/>
			<many-to-many class="cn.itcast.entity.UserInfo" column="user_id"/>
		
		</set>
user = session.get(UserInfo.class, 29l);
		if (null!=user) {
			
			Transaction tx = session.beginTransaction();
			try {
				session.delete(user);
				tx.commit();
				System.out.println("刪除成功");
			} catch (Exception e) {
				tx.rollback();
				e.printStackTrace();
			}
		}
這個操作是沒問題的,但是要知道刪除的面積是非常巨大的,user和role能通過這一個查詢條件聯絡上的全部被幹掉了,我的天吶!!所以輕易的不要去刪除資料,能標記的就標記就好了。。。。

  b, 但是,在刪除的操作上關聯關係還是和inverse類似的,比方說在role中設定了一個cascade屬性,而user中沒有,你查出來user,然後進行刪除操作那就會報錯,原因是,它根本不去查跟user相關聯的role。啪啪把你要查的user查到了,關聯的role都沒管,結果刪除user的時候遇到了外來鍵約束,廢了,回頭control還會給你拋一個:

ConstraintViolationException: could not execute statement: fuck!i hate this!!!!!

今天就記錄這些吧,其他的還得慢慢研究,任重而道遠!