科学研究管理システム総括1——hibernateの部分update


最初の質問は、皆さんに役に立つことを望んでいます.
実は以前はカスケード保存についての問題もありましたが、ネット上ではここでは説明しない例がたくさんありますので、コードをここに列挙しましょう.

/**
		 *     :
		 *     :     Certificate   c
		 * 			     UserInfo   u
		 * 			        CertificateAuthor    ca
		 * c ca     , c  set     ca
		 * u ca     
		 * 
		 *        c       ca,
		 *     cascade = CasedeType.ALL
		 */
		
		//c  ca set,   c     
		Set<CertificateAuthor> s = new HashSet<CertificateAuthor> (); 
		//    c,  Id
		Certificate c = new Certificate();
		//load      
		UserInfo ui = userInfoService.loadById(1);
		//    CA
		CertificateAuthor ca = new CertificateAuthor();
		/**
		 *       ,    
		 *        ca   
		 *          
		 *         null
		 */
		ca.setUserInfo(ui);
		ca.setCertificate(c);
		s.add(ca);
		// c  set  
		c.setCertificateAuthors(s);
//		//  c      ca,  	
		certificateService.save(c);

カスケード保存は基本的に上記の通りです.
本題のhibernateに関する部分updateに入ると、hibernateeのupdateメソッドはすべての属性を取り出して更新することがよく知られています.新しいエンティティのプロパティは、既存のエンティティのすべてのプロパティを上書きします.新しいエンティティの一部のプロパティが空の場合、元のデータはなくなります.
この点についてhibernateのupdateが部分保存を実現しないのは,部分保存には既存のデータのversionを先に取り出し,versionが変更されたかどうかを比較して更新する必要があるためであり,このようなオーバーヘッドが大きすぎて,いっそ直接更新する.
基本的な方法はいくつかあります.
1、あるタイプを設定するのはフィールドが更新できないので、annotationではカラム属性(updatable=false)を設定します.
2、xmlの設定方法で、dymatic-updateなんてネット上にあるはずがない.
3、HQLが一番王道なのは、書くのがちょっと面倒だということです.
4、まず実体loadを出して、それから1対ずつ変えた属性setを更新して、それから更新して、しかしこのように多くのsetを書きます
私の方法:
私の考えは基本的に4つ目の方法を採用していますが、一定の変更をしました.
orgを使っています.springframework.beans.BeanUtilsのcopyPropertyの方法
ダイレクトコード

/*
		 *         Certificate     
		 */
		/*
		 *     VO          
		 *     VO           
		 *            ,     
		 *                  ,
		 *      
		 */
		CertificateVO c = new CertificateVO();
		//        
		Certificate uc = certificateService.getById(29);
		/*
		 *         
		 *        ,      struts      
		 *      
		 */
		c.setName("test");
//		c.setId(14);
//		certificateService.saveOrUpdate(c);
		/*
		 *     
		 *     BeanUtil API
		 *          
		 *         
		 *                
		 *                     
		 *      VO      
		 */
		BeanUtils.copyProperties(c, uc,new String[]{"id"});
		
		//    ,  
		certificateService.update(uc);

さあ、ここまで书いて、皆さんによろしくお愿いします!!