ライブラリと標準
52. 休止状態とは何ですか? JPA と Hibernate の違いは何ですか?
この質問に答えるには、まず JPA とは何なのかを理解する必要があると思います。これは、単純な Java オブジェクトのオブジェクト リレーショナル マッピングを記述し、そのようなオブジェクトを格納、取得、操作するための API を提供する仕様です。つまり、リレーショナル データベース (DB) は、相互接続されたテーブルのセットとして表されます。JPA は、オブジェクトがリレーショナル データベースと対話する方法を記述する、広く採用されている標準です。ご覧のとおり、JPA は抽象的で無形のものです。それはアイデアそのもの、アプローチのようなものです。 ただし、Hibernate は JPA パラダイムを実装する特殊なライブラリです。つまり、このライブラリを使用すると、データベース内のデータ (エンティティ) を表すオブジェクトを通じてリレーショナル データベースを操作できます。このライブラリはJPAの理想に非常に近いと言われています。だからこそ人気が出たのかもしれません。ご想像のとおり、その人気により、さらなる開発と改良が正当化されました。さらに、広く使用されているのは、このツールに関連するあらゆる可能性と不可能性をすでに調査した広大なコミュニティによるものです。Hibernate は徹底的に研究されており、信頼できることがわかります。Spring での理想的な JPA 実装でも一般的に内部で Hibernate を使用するのには十分な理由があります。53. カスケードとは何ですか? Hibernate ではどのように使用されますか?
前に述べたように、Hibernate での通信はエンティティと呼ばれるデータ オブジェクトを通じて行われます。これらのエンティティはデータベース内の特定のテーブルを表し、覚えているように、Java クラスには他のクラスへの参照を含めることができます。これらの関係はデータベースにも反映されます。原則として、これらは外部キー (OneToOne、OneToMany、ManyToOne 関係の場合) または中間テーブル (ManyToMany 関係の場合) のいずれかです。エンティティに他の関連エンティティへの参照がある場合、関係のタイプを示す注釈がこれらの参照の上に配置されます: @OneToOne、@OneToMany、@ManyToOne、@ManyToMany。注釈のカスケード プロパティで、この関係のカスケードのタイプを指定できます。JPA には、エンティティと対話するための特定のメソッド (永続化、保存、マージなど) があります。カスケード タイプは、関連するデータがどのように動作するかを示すために使用されます。これらのメソッドはターゲット エンティティで使用されます。では、カスケード戦略 (カスケード タイプ) とは何でしょうか? JPA 標準では、次の 6 つのカスケード タイプの使用が規定されています。-
PERSIST — 保存操作はカスケードで実行されます ( save()メソッドとpersist()メソッドの場合)。つまり、他のエンティティに関連付けられているエンティティを保存すると、それらのエンティティもデータベースに保存されます (まだ存在していない場合)。
-
MERGE — 更新操作はカスケードで発生します ( merge()メソッドの場合)
-
REMOVE — 削除操作はカスケードで実行されます ( remove()メソッド)
-
ALL — 一度に 3 つのカスケード操作が含まれます — PERSIST — MERGE — REMOVE
-
DETACH — 関連エンティティはセッション ( detach()メソッド) によって管理されません。つまり、関連エンティティのデータが変更されても、データベース内のデータは自動的に更新されず、永続的なデータから分離されたデータに変換されます (つまり、エンティティは JPA によって管理されません)。
-
REFRESH — エンティティがデータベースのデータで更新されるたびに ( refresh() — 切り離されたオブジェクトを更新します)、その関連エンティティも更新されます。たとえば、データベースから取得したデータを何らかの理由で変更したため、元の値を復元したいとします。この場合、この操作が便利です。
-
REPLICATE — 複数のデータ ソースがあり、データを同期する必要がある場合に使用されます (Hibernate のレプリケート メソッド)。すべてのエンティティは、問題なく作成できるようにするために (同じエンティティがデータベースごとに異なる ID を持たないようにするために) 識別子 (id) を持っている必要があります。
-
SAVE_UPDATE — カスケード保存/削除 (Hibernate のsaveOrUpdateメソッドの場合)
-
LOCK — DETACHED操作の反対: 切り離されたエンティティを永続状態に戻します。つまり、現在のセッションはエンティティを再度追跡します。
54. Entityクラスは抽象クラスにできますか?
JPA 仕様 の2.1 エンティティ クラスによると、「抽象クラスと具象クラスの両方がエンティティになることができます。」つまり、答えは「はい」です。抽象クラスはエンティティになることができ、 @Entity アノテーションでマークできます。55. エンティティマネージャーとは何ですか? それは何の責任があるのでしょうか?
まず最初に、 EntityManager はJPAの重要なコンポーネントであることに注意してください。これは、エンティティとデータベースの対話に使用されます。一般に、エンティティとデータベースのやり取りのためのメソッド (永続化、マージ、削除、デタッチ) はエンティティ上で呼び出されます。ただし、このコンポーネントは通常、アプリケーション全体のシングルトンではないことにも注意してください。多くの場合、これは軽量であり、 EntityManagerFactoryを使用して 1 つが削除され、新しいものが作成されます。EntityManagerFactory がDataSourceに相当するJDBCと同様の場合、EntityManagerはConnectionに相当します。前に、永続エンティティは現在の接続によって管理されるエンティティであると述べました。このエンティティは、現在の接続に密接に関連するEntityManagerと、トランザクションの開始/終了を担当するTransactionManagerによって管理されます。以下の図では、エンティティのライフ サイクルを確認できます。 EntityManager は、管理対象ステージにあるエンティティ ( EntityManagerとの接続があるため永続的であるとき) にエンティティを管理します。つまり、新しいものではなく、削除されたものでもありません。エンティティが新規または削除された場合、 EntityManager はエンティティを管理しないため、エンティティも切り離されていると言えます。EntityManagerにはさまざまな戦略があります。アプリケーション全体に対して EntityManager シングルトンを作成することも、接続ごとに毎回新しい EntityManager シングルトンを作成することもできます。Spring を使用している場合、EntityManager の作成/削除は内部で自動的に管理されます (ただし、自分でカスタマイズできないという意味ではありません ^^)。1 つ以上の EntityManager が永続コンテキストを形成することに言及する必要があります。永続コンテキストは、エンティティのインスタンスがデータベース内の同様のエンティティと同期される環境です (前述したように、これは永続エンティティに対してのみ機能します)。JPA (これを強くお勧めします)を深く掘り下げると、この概念に頻繁に遭遇するでしょう。56. Assertクラスとは何ですか? なぜ使われるのでしょうか?
JPAでそのようなクラスについて聞いたことがないので、この質問は単体テストに使用される JUnit ライブラリにあるクラスを参照していると仮定します。このライブラリでは、Assertクラスを使用してコードの実行結果を確認します (ここでのAssert は、コード内の特定の場所に特定の状態/データがあるというアサーションを意味します)。たとえば、猫を作成するメソッドをテストしているとします。メソッドを実行すると、次のような結果が得られます。Cat resultOfTest = createCat();
ただし、それが正しく作成されたことを確認する必要がありますよね? したがって、 createCat()メソッドから取得した cat に含まれると予想されるパラメータを正確に使用して、特定の cat ( expectedCat ) を手動で作成します。次に、 Assertクラスを使用して結果を確認します。
Assert.assertEquals(resultOfTest, expectedCat);
猫が異なる場合は、期待した結果が得られなかったことを示すAssertionErrorがスローされます。Assertクラスには、期待される結果を検証するのに役立つさまざまな操作をカバーするさまざまなメソッドが含まれています。そのうちのいくつかを次に示します。
-
assertTrue(<boolean>) — 引数として渡される値はtrueであることが期待されます
-
assertFalse(<boolean>) — 引数として渡される値はfalseであることが期待されます
-
assertNotEquals(<object1>, <object2>) — 引数として渡されたオブジェクトは、equals ( false )を使用して比較した場合に異なっている必要があります。
-
assertThrows(<ClassNameOfException>.class, <ExceptionObject>) — 2 番目の引数は、最初の引数によってスローされる例外であることが期待されます (つまり、2 番目の引数は通常、必要なタイプの例外をスローするメソッド呼び出しです)。
弦
57. JavaのStringクラスについて説明する
String は、文字列値 (文字のシーケンス) の保存と操作を担当する標準 Java クラスです。これは不変クラスです (不変については以前ここで 書きました)。つまり、このクラスのオブジェクトのデータは、作成後に変更できません。StringBuilderクラスとStringBufferクラスは本質的に同一であることにすぐに注意してください。唯一の違いは、そのうちの 1 つがマルチスレッド環境 ( StringBuffer ) での使用を目的としているということです。これらのクラスはStringに似ていますが、変更可能であるという点で異なります。作成後でも、新しいオブジェクトを作成せずに、それらが表す文字列を変更できます。これらのメソッドは標準のStringメソッドとは異なり、文字列操作用に設計されています (これをビルダーと呼ぶのには理由があります)。58. String オブジェクトを作成するにはどのような方法がありますか? どこで作成されていますか?
文字列を作成する最も一般的な方法は、必要な値を二重引用符で囲んで単純に指定することです。String str = "Hello World!";
new を 使用して明示的に行うこともできます。
String str = new String("Hello World!");
文字の配列から文字列を作成することもできます。
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
これを行うには、オブジェクトの toStringメソッドを呼び出します。
String str = someObject.toString();
これは、文字列を返す他のメソッドを呼び出すことで実行できます。例:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
文字列を作成するには非常に多くの方法があることがわかりました。Stringオブジェクトが作成されると、それはString poolに保存されます。これについては、以下の質問のいずれかで詳しく説明します。
59. 2 つの Java 文字列をどのように比較し、どのように並べ替えますか?
Java では、比較を実行するために 2 つの等号 ( == ) を使用します。int のような単純な値を比較する必要がある場合は、それを使用します。ただし、この方法は本格的なオブジェクトの比較には適していません。参照のみを比較します。つまり、参照が同じオブジェクトを指しているかどうかを比較します。これは、 ==を使用して同じフィールド値を持つ 2 つのオブジェクトを比較するとfalseが返されることを意味します。フィールドの値は同じですが、オブジェクト自体はメモリ内の異なる場所を占めます。 文字列オブジェクトは、見かけの単純さにもかかわらず、依然としてオブジェクトです。==を使用してそれらを比較することも適切ではありません (文字列プールが存在するにもかかわらず)。適切な解決策は、Objectクラスの標準の等しいメソッドです。これを正しく機能させるにはオーバーライドする必要があります (デフォルトでは、比較に==を使用します)。Stringクラスはこれをオーバーライドするので、その実装を使用するだけです。String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
平等性の比較について話しました。次に、並べ替えのための比較を考えてみましょう。結局のところ、何かを並べ替える場合は、並べ替えにどのような原理を使用するかを知る必要があります。これを行うには、標準のソートセットであるTreeSetを使用できます。このデータ構造は、赤黒ツリー アルゴリズムに依存し、指定された並べ替え原則に従ってセットを並べ替えます。前に述べたように、特定のタイプのオブジェクトを並べ替える方法を理解する必要があります。並べ替えの比較方法を割り当てるには、comparators を
使用します。通常、並べ替えるクラスに対してこれらを実装する必要がありますが、 Stringの場合、それらはすでに実装されています。したがって、文字列をTreeSetに追加するだけで、文字列が並べ替えられます。
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
コンソール出力:
60. 文字列を文字に変換するアルゴリズムを提供します。対応するコードを書きます
前に述べたように、Stringオブジェクトにはさまざまな便利なメソッドがたくさんあります。そのうちの 1 つはtoCharArrayです。このメソッドは、文字列を文字配列に変換します。String str = "Hello world";
char[] charArr = str.toCharArray();
次に、インデックスによって参照できる文字の配列があります。
char firstChar = charArr[0]; // H
61. 文字列をバイト配列に変換したり、逆に変換したりするにはどうすればよいですか? 対応するコードを書きます
StringクラスにはgetBytesメソッドがあります。これはtoCharArrayメソッドに似ており、文字列をバイト配列として返します。String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
今日のレビューの論理的な結論に達しました。読んでくれてありがとう!
GO TO FULL VERSION