【Hibernateフレームワーク開発の7】Annotation各種関係CRUD添削調査&集合マッピング&継承マッピング


まず、AnnotationにおけるCRUDのC(Create)操作について:-------------------------
仮定:User(MonyToOne)Group
OKです.では、次のJunit Codeがあります.
 
   
   
   
   
  1. Configuration cfg = new AnnotationConfiguration(); 
  2. SessionFactory sf = cfg.configure().buildSessionFactory(); 
  3. Session ss = sf.getCurrentSession(); 
  4.  
  5. Group group = new Group(); 
  6. group.setName("Group1"); 
  7.  
  8. User user = new User(); 
  9. user.setName("User_Himi");// 1( ) 
  10. user.setGroup(group); 
  11.  
  12. ss.beginTransaction(); 
  13.  
  14. //ss.save(group);// 2 
  15. ss.save(user); 
  16.  
  17. ss.getTransaction().commit(); 
  18. sf.close(); 

メモ1:2つをデータベースに関連付ける場合は、メモリに関連付ける必要があります.
備考2:ここで備考2行のコードを注視すると、エラーが表示されます.Hibernateのデフォルトでは、関連変数はデータベースに自動的に保存されないため、CRUDの操作にかかわらず、デフォルトでは自動的に保存されません(カスケードは生成されません).
では、自動操作関連オブジェクトを設定する必要がある場合は、cascadeを使用して、@ManyToOneで現在設定しています.

@ManyToOne(cascade={
			CascadeType.ALL
	})

ここでcascadeには配列のパラメータが必要です.パラメータはすべてCascadeTypeで、CascadeTypeのタイプは以下のとおりです.
 
   
   
   
   
  1. CascadeType.ALL,//  
  2. CascadeType.MERGE,//  
  3. CascadeType.PERSIST,//  
  4. CascadeType.REFRESH,//  
  5. CascadeType.REMOVE  //  

 
まとめ:デフォルトで関連するオブジェクトは、任意の形式の関係マッピングにかかわらず、一方向でも双方向でも、Sessionが永続化されるときに互いに影響を及ぼさず、自動的にカスケードを確立しません.データベースへのカスケード関係を自動的に確立する必要がある場合は、リレーショナルマッピングの注釈にcascadeを設定します.
もう1つ:双方向関係プログラムで双方向のメモリ関連関係を設定し、双方向にmappedByを設定する必要があります!
気をつけて!CascadeType.ALL以外のタイプは、対応する関数メソッドを使用する必要があります!
 
AnnotationにおけるCRUDのR(read)操作について:-------------------------
1.CUD操作時にはcascadeが集約されますが、杜宇R読み取り時にはfetchを使用します!
2.デフォルトでは、ManyToOneを読み込んで任意のManyのオブジェクトを取り出すと、対応するOneがデフォルトで取り出されます.
デフォルトでOneToManyの読み込み時にOneを取り出した場合、デフォルトのManyは取り出されません.
手動設定が必要な場合はfetchを使用します.
fetchには2つの値があります.
1). EAGER(すぐに)
2). LAZY(怠け者d)
OneToManyでOneを取り出したときに他のすべてのmanyをすぐに取り出したい場合は、次のように設定できます.
@OneToMany(fetch=FetchType.EAGER)これでOneを取り出したときにすべてのManyオブジェクトを取り出します
備考:OneToManyがEAGERを使用する場合、sessionFactoryがオフになってもManyのいずれかの要素を取ることができますが、ManyToOneがLAZYを使用している場合はsessionFactoryがオフになってもOneを取り出すことはできません.LAZYであるため、デフォルトではOneを取り出すことはできません.
注意:1)両方ともEagerを設定しない(余分なクエリ文が発行される)
2)多方面に対してfetchを設置する時注意する:一般的にLazyを使う;
AnnotationにおけるCRUDのU(update)操作について:-------------------------
シンプルupdateはあまり言わない.
AnnotationにおけるCRUDのD(delete)操作について:-------------------------
デフォルトdeleteの場合、たとえばManyToOneの場合、manyの要素の1つを削除すると、Hibernateはまず対応する要素を削除し、その後、対応するOneを削除し続けます.テーブルには他の要素があり、他のすべてのMany要素を削除し、最後にOneを削除します.
ソリューション:
1)他のcascadeを使用し、ALLタイプを直接使用しない.
2)関連関係を破る.nullを使用して、関連するOneをnullにセットし、対応するレコードを削除すればよい.
3)HQL文で削除
.......................................集合マッピング........................
一般的には、次のコレクションが使用されます.
Set(HashSet)は一般的に使用される.
List(ArrayList)は、一般的にソートが必要な場合に使用されます.
ソートには注記:@OrderBy(「name ASC」)を使用できます.
Map(HashMap)は@MapKey(name="id")に注目する必要があります.
 
.......................................継承マッピング........................
継承マッピングには、次の3つの形式があります.
1)1枚の表の形式を使う:SINGLE_TABLE
2)それぞれ1枚の表がないTABLE_PER_CLASS
3)サブクラスごとに1枚の表JOINED