ホームページ > 記事 > ウェブフロントエンド > Hibernate some_methods_@annotations_code example_html/css_WEB-ITnose
データベースを操作するための 7 つのステップ:
1 SessionFactory オブジェクトを作成します
2 Session オブジェクトを作成します 3 トランザクションをオンにします: 休止状態では、すべてのデータベース操作 (クエリも含む) はトランザクションである必要があります
4 データ保存操作を実行します(対応する操作メソッドが実行される前に送信する必要があります)
5 トランザクションを送信する
6 セッションを閉じる
7 SessionFactory オブジェクトを閉じます
//最初のステップ
SessionFactory:
1 SessionFactory オブジェクトを作成します
構成:
//创建Configuration对象 Configuration configuration = new Configuration().configuer(); // 4.0之后为了分布式,用了这种设计 链接hibernate框架 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry();
//创建一个SessionFactor对象 SessionFactory sessionFactiony = null; 给SessionFactory对象赋值 sessionFactory = configuration.buildSessionFactory(serviceRegistry); //或 SessionFactory sessionFactiony = configuration.buildSessionFactory(serviceRegistry);//也行,一样
//第二步
Session :
2 创建 Session对象
//用上面创建好的SessionFactory对象,调用方法,创建一个session对象
(1) Session session = sessionFactory.getCurrentSession();
(2) Session session = sessionFactory.opensession();
getCurrentSession :
创建session对象 如果有,就不创建,如果没有就创建
Session session = sessionFactory.getCurrentSession();
并且,自动关闭资源 不用写 session.close();
opensession :
创建session对象,别管有没有,都创建
Session session = sessionFactory.opensession();
并且,用手动关闭资源,
session.close();
//第三步
Transaction :
3 开启事务:hibernate中,然后数据库操作,都必须是事务的,哪怕是查询
Transaction transaction = session.beginTransaction();
//第四步
4 执行数据保存操作
//增
Save :
Save();//添加语句方法,生成insert into 表名(列,列)values(?,?)
//删
Delete :
Delete();//删除语句方法,生成delete from 表 where id=?;
//改
Update :
Update();//修改语句,
//如果表里面有对应的语句,就生成修改语句update 表名 set (列名,列名)=(列值,列值) where id = ?;
//查
Load :
Load();//查询语句方法,生成查询语句,select * from 表 where id=?
//如果不访问里面的属性,就只是查询一下,并不会执行到数据库,除非用里面每行对应的对象,去调用一个属性,才会真正的到数据库
//如果只是提交了,没有访问里面的属性,不会生成查询语句,就是没有对数据库进行操作
Get :
Get();//查询语句方法,生成查询语句,select * from 表 where id=?
//只要提交,就会生成查询语句,
//Get()和Load()的区别 Load()和Get()的区别
Get() : 只要调用Get()方法并提交,就直接生成查询语句去访问数据库
Load() : 要调用Load()方法并提交,且,如果没有访问对象里面的属性,不会生成查询语句,也不会操作数据库,一定要获取一下属性,获取对象引用,也算获取属性
//第五步
commit :
5 提交事务
transaction.commit();// 提交事务
transaction是第三步,开启事务的对象
//第六步
Session_close :
6 关闭Session
// session.close();//getCurrentSession();不需要手动关闭,opensession需要手动关闭
//第七步
SessionFactory_close :
7 关闭SessionFactory对象
sessionFactory.close();
//强注解,强注释
!!!对表来说,只有多的一方保存少的一方的引用,那些设置都是给程序看的,和数据库没有任何关系!!!
@ :
@Entity 在类名上面加的,用于创建表 默认是类名
创建实体类和数据标的映射,指定表名
将一个类声明为一个实体bean(即一个持久化POJO类)。
@Entity(name="表名") 这样也行,就规定了表名
@Table :
@Table(name="表名");也行
//1 を追加する必要があります:
@IdClass を使用して 2 つのクラスを関連付け、その後にクラス名を付けます
use using using ‐アウト アウト スルー スルー アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウト)
@Column 現在の列を変更するときに変更できるかどうかを設定します
use using through 's ' through out's out's out together out out out outmbmb out out outmb out out out out out out out out out out together
' ' s--
この列内の対応する値:
の値が空であるかどうか。デフォルト値は、FALSE值 Insertableの列がInsertステートメントの生成時に列であるかどうかです。デフォルト値は、この列の追加値ではなく、Trueが追加された場合です。この列は変更されません。この特定の列のSQL DDLフラグメントは、異なるデータベース間で移植されている可能性がありますデータはここにあります
DTO: 呼び出される日付トラクション オブジェクト
VO: 値オブジェクト
@SequenceGenerator:
シーケンス ジェネレーター
@SequenceGenerator(name="sequenceGenerator", sequenceName="Msg_S EQ",initialValue =0,allocationSize=1)//ジェネレーター名、シーケンス名、開始値は 0、ステップ サイズは 1 です
@TableGenerator ジェネレーターはクラスに書かれています
//以下のエンティティ クラスに対応するテーブルを格納するために使用されます 1 回使用される ID (テーブルID が保存される場所)
//データベース プラットフォーム間で使用できる主キー用の別のテーブルを作成します。MySQL の主キーの自動インクリメントは、外部で指定されるものではなく、自分で指定されます。同じである可能性があります。
// とはクロスプラットフォーム データ ストレージの問題は、データベース プラットフォームが異なると、主キー (pk) などの異なる方法でデータを生成するためです。それでも、異なるデータベース プラットフォームとの互換性を保証するにはどうすればよいでしょうか。プラットフォーム
//ここでの方法は、新しいテーブルを作成することです。ID を保存するために特別に使用されるテーブル、テーブル名: GENERATOR_TABLE、テーブルには 2 つの列があります
//最初の列は、名前である pkColumnName="key" を保存します。主キーが配置されている列の値です
//2 番目の列は、ID 値を保存します。valueColumnName= "studentId"
//3 番目と 4 番目の列は値を保存します。3 番目の列はキーの値、つまりテーブルですID を保存する名前、4 番目の列は保存するステップ値です。デフォルト値は 1 です
//これは、対応するテーブルが存在する限り、そのテーブルは無数のテーブルの ID 値を保存できることを意味します。一度、ID はデフォルトで 1 つ増加します。これはシーケンスのコレクションに似ています
@TableGenerator( //Generator
name = "Student_gen", // ジェネレーターの名前
table = "Generator_table", // データベースでは、テーブルの名前
pkcolumname = "key", // 主キーの名前
ValueColumname = "StuationId",//// /次回保存する場合は、ID のデータを保存します列、ここで取得したIDの値です
pkcolumnvalue = "Student", // テーブルのテーブル
InitialValue = 1, // 開始値は 1 です
AllocationSize = 1 // ステップは1です
)
物理クラスの物理クラスに対する@IDの強力なアノテーション
対応するIDをカラム名として取得し、このメソッドでそのIDのID値を取得できます
と同等テーブルの設定 内部の主キー
@GeneratedValue // @id と getId() に直接設定 ジェネレーターに移動して値を取得するため、追加されるデータの ID は毎回異なり、一意ではなくなります カラムを設定しますto auto-increment
generator=" ジェネレーターの名前 " //ID を取得するジェネレーター
5 形式
1 自動ランダム
2 テーブル テーブルを生成してテーブルに格納する 3 アイデンティティ シーケンスの種類
4 シーケンス シーケンスジェネレーター、シリアル番号を生成します
5 カスタマイズ 自分で書きました
@GeneratedValue(strategy=GenerationType.generated format,generator="ジェネレーターの名前")
@GeneratedValue(strategy=GenerationType.TABLE,generator="student_GEN")
@OneToOne
个 どちらかを書き込み、1 つは @Onetoone を書き込み、もう 1 つは @manytoone を書き込みます
@manytoone 内の多のいずれかに unique = "true" 設定を追加する必要があります)
マッピングは夫の妻の属性で行われます。基準に基づいていますが、ここで制御する必要はありませんが、このテーブルを追加すると、テーブルの ID への参照が生成されます
。反対側のテーブルの値が生成されると、この列が参照されて ID が生成され、反対側のテーブルの ID として使用されます
クラス内で get ** ()心配する必要はありませんが、そこの属性は妻を指しています
@ManyToOne
使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用するカラム名
@ManyToMany//Many-to-many
// テーブル名とカラム名を変更したい
@JoinTable(name = "t_s", // テーブル名 中間テーブル
joinColumns = { @JoinColumn(name = "Teacher_id") },//中間テーブルの列名
inverseJoinColumns = { @JoinColumn(name = "student_id") })//上記の列名が指しているものは、まず指定された列名でこの列を見つけます上記の名前であれば、Studentテーブルが見つかります
@Joincolumn
名前 外部キーカラムの名前を指定し、長さ、制約なども指定できます。 上記の外部キー参照()メソッド(// 以下ではtable、多数のテーブルに設定されている、小さなテーブルの引用の列のリスト名、小さなテーブルの列の列のリスト、Listing @ @Embedded
、および他のテーブルには @entity がありません、 get ** () メソッドに書かれています
@Embedded(name="asd") は別のテーブルを指定し、現在のテーブルが参照する列の列名を保存します
!!! 1 対 1 の場合のみ、主キー マッピングと外部キー マッピングがあります
//プライマリキーマッピング @primarykeyjoincolumn
@primarykeyjoincolumn、別のテーブルの主要なキーに関連する//属性の反対側にある外部キーマッピング
//反対側の参照を保存しません。反対側の反対側の属性に参照を保存させ、この列が別のテーブルに関連付けられるようにします
mappedBy:
双方向の関係がある限り、参照を保持する必要があります。相手に対しては、mappendBy (反対) が必要です (双方向に限定)、小さいパーティは使用する必要があります。集合コレクションはパーティの参照をより多く保存し、両側は複数のペアでマークされます @ManyToOne (書き込み用) many) と @OneToMany (1 つに対して書き込み)
テーブルの場合、より多くのパーティのみが、より少ないパーティの参照を保存します。これらの設定はプログラムが参照するためのものであり、データベースとは何の関係もありません
@OneToMany (mappedBy="group",//反対側のテーブルに列を生成します。この列は特にこのテーブルの ID への参照を保存します。このテーブルが追加されたとき、反対側のテーブルのこの列に値を生成させます反対側のテーブルが追加されると、この列が参照されて ID が生成され、その ID が反対側のテーブルの ID として使用されます。 cascade={CascadeType.ALL},// -レベルの結合操作を設定します。 work? FETCH = FETCHTYPE.EAGER // クラスリスト操作。パーティ数が少ないため、デフォルトは Lazy です
)
cascade = {Cascadetype.all/DETACH /MERGE/PERSIST/REFRESH/REMOVE/Custom};
/ /カスケード操作、つまり A の追加、削除、変更、チェック、および B の変更が有効になったときに設定されます。これはイベントをバインドするのと同等であり、その後の値はイベント内で、このイベントが有効な場合に設定されます。トリガーされると、2 つのテーブル A と B の属性が更新され、同期されます。 Cascade
using - off ‐ off OUT-out-out-out-out- ,
列は参照を B に保存します。EAGER の場合がここに設定されていると、B への参照を保持する列も取り出されます
Generate state:
// クエリ文を生成します
があるかどうかを意味します。ここで LAZY が設定されている場合、フェッチまたは表示するときに、B の参照を保存している列は取り出されず、他の列のみが取り出されます。 B への参照はセッション オブジェクト (バッファ) を閉じる前に使用され、クエリ ステートメントが生成され、データベースがクエリされ、列が取り出されます。 ステートメントの生成:
B の参照を保存する列が到達した場合は 2 つのクエリ ステートメントが生成され、それ以外の場合は 1 つのクエリ ステートメントが生成され、最初のクエリ ステートメントには B
//実行順序
@Before/@BerforeClass -& gt; の参照を保持する列が含まれません。 Test-& GT; @AFTER/ @AFTERCLASS @Beface:
は、強いコメントに使用されるテスト クラスで、最初に実行されます。パブリック、戻り値なし、パラメーター リストなし、メンバー メソッド
@BerforeClass
です。テスト クラスで使用され、強くアノテーションが付けられたテスト メソッドが最初に実行されます。このメソッドは静的メソッドであり、戻り値もパラメーター リストもありません。 @@test:
はテストクラスで使用されています。メンバー メソッド
このメソッドは静的メソッドであり、戻り値がなく、パラメーター リストもありません:
using using ' s ' s ' s ' s ‐ ‐ ‐ ‐‐‐‐‐とデータベースへ) ---> フリー状態(保存完了後セッションオブジェクトを閉じる(session.close()))
/ /3 つの状態を区別する鍵は、
1 ID があるかどうか
2 ID がデータベースにあるかどうか
3 メモリ内に (セッション キャッシュ) があるかどうか
Transient:
Transient (一時的な状態): Anエンティティ クラス オブジェクトはメモリ内にあり、ID がなく、キャッシュにもありません
//エンティティ クラスがインスタンス化されるとき、それは一時的な状態です
Persistent:
Persistent (永続状態): メモリ内に存在します、存在しますキャッシュにあり、データベースに存在します (ID)
// データベースに保存され、永続的な状態です
Detached:
Detached (free 状態): メモリに存在します、キャッシュはありませんが、データベースはhas ID
//セッションオブジェクトを閉じた後(session.close())、フリー状態になります
//これら 3 つの状態で注意が必要なのは、この状態でデータベース操作を実行するとどうなるかです。 Resultたとえば、属性の値を変更するときに更新ステートメントは発行されますか?
一時的な状態: 更新ステートメントは発行されません
アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウト、アウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトスピードs - - - - '、クラスでは、プライマリキークラスの参照の上で、対応するGETプライマリキークラス()。メソッド
@Embeddable: の上に埋め込むことができます。このクラスは、別のクラス
1
@IdClass: の一部として主キー クラスに記述されます。たとえば、getId のすぐ上に 2 つの主キー、id 列と name 列があります。 () と getName() をエンティティ クラスに記述し、@id を追加して主キーを宣言し、クラスに @IdClass (主キー クラス名.class と記述) を記述します。そして、これら 2 つの主キーをエンティティ クラスに記述します。
ただし、複数の主キーを持つこのエンティティ クラスは、シリアル化可能なインターフェイスを実装する必要があります
主キー クラスでは、 @Embeddable
2
@EmbeddedId: を記述する必要はありません
または、このクラスには ID と名前が記述されていませんが、主キークラスへの参照を取得し、主キークラスに対応する getprimary key class(); メソッドに @EmbeddedId を記述するだけです
ただし、主キークラスのクラスには @Embeddable を記述する必要があります
クエリ :
//--------------------------------------模糊查询
QBE :
トピック tExample = new Topic();//自分で作成したクラス
// テーブル内の行の属性であるクラス オブジェクトを作成します
tExample.setTitle("T_") // オブジェクトに属性を設定します (set***() メソッド);典型的な T_ は、検索に使用される、特定の値を持つオブジェクトのみになります
例 e = Example.create(tExample).ignoreCase().enableLike();//ファジー クエリを追加する静的メソッド
条件 c = session.createCriteria(Topic.class)//指定されたクラス (テーブル) に制約を追加します
.add(Restrictions.gt("id", 2))//id 属性が 2 より大きい
.add(Restrictions.lt("id", 8))//id 属性が 8 未満の
.add(e); //「T_」の上に書かれたファジークエリ
//-----------------1+N
//1+N: 現在のオブジェクトがクエリされている限り、他のオブジェクトもクエリします
//複数のテーブル クエリを使用して 1+N 問題を解決できます
);////@BathSize: デフォルトはここで各フェッチの数を指定できます。
left_outer_join_fetch:
(イテレータを使用する場合は結合は使用できません)
Query q = session.createQuery("from Topic t left external join fetch t.category c ");//トピックはオブジェクトであり、オブジェクトには別のテーブルへの参照である属性があります。t.category は別のクラスを取得できます対応するテーブルとその中の属性
List41b0101b1c8670b802aba7e1f8d5124c topic = q.list(); // クエリされた値を対応するオブジェクトにカプセル化し、それをリスト コレクションにカプセル化します。
List41b0101b1c8670b802aba7e1f8d5124c topic = session.createQuery(" left external join fetch t.category c");
前提: オブジェクト (テーブル) には属性 (列) が存在する必要があり、保存されるのは別のテーブルへの参照です
例:カテゴリへの参照を保存するトピック オブジェクト
例: List41b0101b1c8670b802aba7e1f8d5124c topic = session.createQuery("from table 1 alias (t) left external join fetch t. table name 2 alias (c)");
inner_join_fetch :
リスト< category> topics.createquery( "topic t inner join fetch t.category c"); Topic オブジェクトに対応するテーブルを検索し、トピックを通じてカテゴリに対応するテーブルを検索します。さらに、カテゴリに対応するテーブルがクエリされ、トピックの左側に表示されます。 2 つのテーブルの結果セットを 1 つのテーブルにまとめます)
List41b0101b1c8670b802aba7e1f8d5124c topic = session.createQuery("from Topic t left inner join fetch t.category c");を使用してを使用する 使用する 使用する - オフ ‐ 使用-list41b0101b1c8670b802aba7e1f8d5124c トピック = session.createQuery("トピック t 左外部結合フェッチ t .category c"); 右側
まず、 Topic オブジェクトに対応するテーブルを検索し、トピックを通じてカテゴリに対応するテーブルを検索し、さらにカテゴリに対応するテーブルをすべてクエリします。トピックの右側に表示されます (テーブルにマージされた 2 つのテーブル セットの結果に相当します。1 つは左側、もう 1 つは右側)
List41b0101b1c8670b802aba7e1f8d5124c topic = session.createQuery("from Topic t right external join fetch t.category c");
iterator :
// iterator : join が許可されていない場合
// イテレータ、クエリされたデータをイテレータで直接走査しますイテレータ カテゴリに使用されます。 = session.createQuery("from オブジェクト エイリアス").iterate( );//
Iterator41b0101b1c8670b802aba7e1f8d5124c カテゴリ = session.createQuery("from カテゴリ c").iterate();//
while (categories.hasNext( )) {//hasNext() は、次の人に要素があるかどうかを尋ねます。戻り値は true/false です。 );// オブジェクトで満たされているため、オブジェクト内のプロパティにアクセスできます。上記で取得したオブジェクトへの参照 }
キャッシュ可能:
ehcache を使用します。 = session.createQuery("from category").setCacheable(true).list();//Category オブジェクトに対応するテーブルをクエリし、putそれをキャッシュに保存し、リスト コレクションにカプセル化します
setCacheable(true);//キャッシュを有効にする
上記は、いくつかの Hibernate_methods_@annotations_code example_html/css_WEB-ITnose の内容です。詳細については、PHP に注意してください。中国語のウェブサイト (www.php.cn)!