1. 程式人生 > >關於專案中hibernate無法刪除中間表記錄

關於專案中hibernate無法刪除中間表記錄

這是我在做專案的時候碰到的一個頭疼問題,記錄下來用於以後回顧。我們在學習hibernate時候大概見得最多的老師講解是使用的Junit單元測試來測試資料:例如下面的程式碼用於多對多級聯操作:

@Test
	public void	 many2(){
		SessionFactory sessionFactory = null;
		Session session=null;
		Transaction tx=null;
		try {
			 sessionFactory=com.spring.one.SessionFactory.getSF();
			session=sessionFactory.openSession();
			tx=session.beginTransaction();
			//讓某個使用者有某個角色
			User user=new User();
			//查出這個使用者
			user=session.get(User.class, 1);
			//查出這個角色
			Roles roles=new Roles();
			Roles roles1=new Roles();
			roles=session.get(Roles.class, 3);
			roles1=session.get(Roles.class, 2);
			//把角色付給使用者
			//user.getLset().add(roles);
			//把某個角色去除
			user.getLset().remove(roles);
			
			tx.commit();
			
		} catch (Exception e) {
		  tx.rollback();
		}
		finally{
			session.close();
			sessionFactory.close();
		}
	}

這種可以remove掉Set集合中的物件因為new出來的物件與移除的物件的hashcode值一致。

注意:Set的remove是用hashcode值來判斷集合中的物件與移除掉物件是否一致。在專案中我們往往使用spring的注入方式來生成物件的這就使得每個物件的地址會發生改變。因此要想remove掉多對多的中間表我們可以這樣做:

public void uncheck(Student student,Course cs) {		
	  //因為Set中的物件是由hashcode來標識的所以不能直接去remove物件,必須先從Set中查出需要remove的物件在移除掉
		Iterator<Course> it=student.getSc().iterator();	      
	    while(it.hasNext()){
		   if(it.next().getCid()==cs.getCid()){
			   it.remove();
		   }
	   }
		hib.merge(student);		
	}

假如學生中所選課程為cs。如果退課如cs我們可以通過遍歷Set去比對cs的id相同時把遍歷到的物件remove掉

如果有大牛有更好的方法希望不吝賜教。小弟謝過了