【Hibernateフレームワーク開発の7】Annotation各種関係CRUD添削調査&集合マッピング&継承マッピング
4758 ワード
まず、AnnotationにおけるCRUDのC(Create)操作について:-------------------------
仮定:User(MonyToOne)Group
OKです.では、次のJunit Codeがあります.
メモ1:2つをデータベースに関連付ける場合は、メモリに関連付ける必要があります.
備考2:ここで備考2行のコードを注視すると、エラーが表示されます.Hibernateのデフォルトでは、関連変数はデータベースに自動的に保存されないため、CRUDの操作にかかわらず、デフォルトでは自動的に保存されません(カスケードは生成されません).
では、自動操作関連オブジェクトを設定する必要がある場合は、cascadeを使用して、@ManyToOneで現在設定しています.
ここでcascadeには配列のパラメータが必要です.パラメータはすべてCascadeTypeで、CascadeTypeのタイプは以下のとおりです.
まとめ:デフォルトで関連するオブジェクトは、任意の形式の関係マッピングにかかわらず、一方向でも双方向でも、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
仮定:User(MonyToOne)Group
OKです.では、次のJunit Codeがあります.
- Configuration cfg = new AnnotationConfiguration();
- SessionFactory sf = cfg.configure().buildSessionFactory();
- Session ss = sf.getCurrentSession();
-
- Group group = new Group();
- group.setName("Group1");
-
- User user = new User();
- user.setName("User_Himi");// 1( )
- user.setGroup(group);
-
- ss.beginTransaction();
-
- //ss.save(group);// 2
- ss.save(user);
-
- ss.getTransaction().commit();
- sf.close();
メモ1:2つをデータベースに関連付ける場合は、メモリに関連付ける必要があります.
備考2:ここで備考2行のコードを注視すると、エラーが表示されます.Hibernateのデフォルトでは、関連変数はデータベースに自動的に保存されないため、CRUDの操作にかかわらず、デフォルトでは自動的に保存されません(カスケードは生成されません).
では、自動操作関連オブジェクトを設定する必要がある場合は、cascadeを使用して、@ManyToOneで現在設定しています.
@ManyToOne(cascade={
CascadeType.ALL
})
ここでcascadeには配列のパラメータが必要です.パラメータはすべてCascadeTypeで、CascadeTypeのタイプは以下のとおりです.
- CascadeType.ALL,//
- CascadeType.MERGE,//
- CascadeType.PERSIST,//
- CascadeType.REFRESH,//
- 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