Overview
このガイドでは、Plain Old Java Object(POJO)によってモデル化されたデータを保存および検索する方法を学習できます。POJO は、ビジネス ロジックをデータ表現から分離するデータ カプセル化によく使用されます。
Tip
POJO について詳しくは、Wikipedia で Plain old Java object に関する記事を参照してください。
このガイドの例では、次のタスクを実行する方法について説明しています。
POJO をシリアル化およびデシリアル化するようにドライバーを構成する
POJOでモデル化されたデータを使用してCRUD操作を実行する
POJO の例
このガイドのセクションでは、花の特性を説明する次のサンプル POJO クラスを使用します。
public class Flower {
private ObjectId id; private String name; private List<String> colors; private Boolean isBlooming; private Float height;
// public empty constructor needed for retrieving the POJO public Flower() { }
public Flower(String name, Boolean isBlooming, Float height, List<String> colors) { this.name = name; this.isBlooming = isBlooming; this.height = height; this.colors = colors; }
public ObjectId getId() { return id; }
public void setId(ObjectId id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Boolean getIsBlooming() { return isBlooming; }
public void setIsBlooming(Boolean isBlooming) { this.isBlooming = isBlooming; }
public Float getHeight() { return height; }
public void setHeight(Float height) { this.height = height; }
public List<String> getColors() { return colors; }
public void setColors(List<String> colors) { this.colors = colors; }
@Override public String toString() { return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}"; }}MongoDB 内でデータを保存および検索するための POJO を定義する場合は、次のガイドラインに従います。
POJO クラスは、インターフェースを実装したり、フレームワークからクラスを拡張したりすることはできません。
データを保存および取得するフィールドをすべて含め、それらが
staticまたはtransientとしてマークされていないことを確認します。POJO で JavaBuild の命名規則 を使用して公開 getter メソッドまたは setter メソッドを含めると、ドライバーはデータを直列化または逆直列化するときにそれらを呼び出します。パブリックプロパティフィールドの getter メソッドまたは setter メソッドを省略すると、ドライバーはそれらに直接アクセスするか、割り当てます。
POJO のドライバーの設定
POJO を使用するようにドライバーを構成するには、次のコンポーネントを指定する必要があります。
PojoCodecProviderインスタンス: POJO 形式と BSON 間でデータをエンコードおよびデコードする方法を定義するコーデックを持ち、 コーデックが適用される POJO クラスやパッケージを指定します。CodecRegistryコーデックやその他の関連情報が含まれるインスタンス。MongoDatabaseインスタンス、またはCodecRegistryインスタンス。MongoCollectionを使用するために構成されたもの。MongoCollectionインスタンス。TDocumentジェネリック型にバインドされた POJO ドキュメント クラスを使用して作成されたもの。
前のセクションで定義された構成要件を満たすには、次の手順を実行します。
PojoCodecProviderを設定します。この例では、PojoCodecProvider.Builderのautomatic(true)設定を使用して、コーデックを任意のクラスとそのプロパティに適用します。CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();注意
コーデック プロバイダーには、シリアル化の動作をさらに定義する
ClassModelやConventionインスタンスなどの他のオブジェクトも含まれています。コーデック プロバイダーとカスタマイズについて詳しくは、POJO カスタマイズのガイドを参照してください。PojoCodecProviderインスタンスをCodecRegistryに追加します。CodecRegistryを使用すると、POJO データをエンコードするための 1 つ以上のコーデック プロバイダーを指定できます。この例では、次のメソッドを呼び出します。fromRegistries()。複数のCodecRegistryインスタンスを 1 つのインスタンスにまとめるためのもの。getDefaultCodecRegistry()コーデックプロバイダのリストからCodecRegistryインスタンスを検索するfromProviders()PojoCodecProviderからCodecRegistryインスタンスを作成する
次のコードは、
CodecRegistryをインスタンス化する方法を示しています。// Include the following static imports before your class definitionimport static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;import static org.bson.codecs.configuration.CodecRegistries.fromProviders;import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; ... CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));CodecRegistry内のコーデックを使用するようにMongoDatabaseまたはMongoCollectionインスタンスを構成します。コーデックを指定するには、データベースまたはコレクションのいずれかを構成できます。この例では、
withCodecRegistry()メソッドを使用して、sample_pojosと呼ばれるMongoDatabaseにCodecRegistryを設定します。MongoClient mongoClient = MongoClients.create(uri);MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry);次のコードに示すように、POJO クラスをドキュメント クラス パラメーターとして
getCollection()の呼び出しに渡し、それをMongoCollectionインスタンスの型引数として指定します。MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);
CRUD 操作を実行
Flower POJO を使用するように MongoCollection インスタンスを構成すると、POJO によってモデル化されたデータに対して CRUD 操作を実行できます。
この例では、Flower POJO を使用して次の操作を実行する方法を示します。
Flowerのインスタンスをflowersコレクションに挿入しますコレクション内のドキュメントを更新する
コレクション内のドキュメントを削除する
コレクション内のすべてのドキュメントを検索して印刷する
// Insert three Flower instancesFlower roseFlower = new Flower("rose", false, 25.4f, Arrays.asList(new String[] {"red", "pink"}));Flower daisyFlower = new Flower("daisy", true, 21.1f, Arrays.asList(new String[] {"purple", "white"}));Flower peonyFlower = new Flower("peony", false, 19.2f, Arrays.asList(new String[] {"red", "green"}));collection.insertMany(Arrays.asList(roseFlower, daisyFlower, peonyFlower));
// Update a documentcollection.updateOne( Filters.lte("height", 22), Updates.addToSet("colors", "pink"));
// Delete a documentcollection.deleteOne(Filters.eq("name", "rose"));
// Return and print all documents in the collectionList<Flower> flowers = new ArrayList<>();collection.find().into(flowers);System.out.println(flowers);この例では、次の出力が印刷されます。
[Flower { id: 65b178ffa38ac42044ca1573 name: daisy colors: [purple, white, pink] isBlooming: true height: 21.1},Flower { id: 65b178ffa38ac42044ca1574 name: peony colors: [red, green] isBlooming: false height: 19.2}]注意
デフォルトでは、PojoCodecProvider は POJO 内の null に設定されているフィールドを省略します。この動作を指定する方法について詳しくは、POJO カスタマイズのガイドを参照してください。
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
よくある質問
このセクションでは、 MongoDBに POJO を保存するときに発生し得る質問に答えます。
ID フィールド値を自分で指定する必要がありますか。
いいえ、 PojoCodecProviderは ObjectId を自動的に生成します。
ID フィールドは複合キーにできますか。
はい。複数の値を保持するフィールドに @BsonId を付け、それを複合キーとして使用します。次の例では、code フィールドと date フィールドを持つ EntityKeyクラスを定義し、それを Entity POJO の _idフィールドとして使用します。
public static class EntityKey {
@BsonCreator public EntityKey(@BsonProperty("code") String code, @BsonProperty("date") Date date) { this.code = code; this.date = date; }
// getters}
public static class Entity {
@BsonId private final EntityKey key;
@BsonCreator public Entity(@BsonProperty("key") EntityKey key) { this.key = key; }
// getters and setters}POJO アクターで多形データを使用できますか。
はい、弁別子を使用します。詳細については、 POJO カスタマイズガイドの「 識別子 」セクションを参照してください。
プライベート、保護、パブリックのセッターとゲッターを混在させることはできますか。
いいえ。ネイティブ POJO コーデックでは、ゲッターとセッターが各フィールドに対して同じ修飾子を持つことを前提としています。
たとえば、次のメソッドはエンコード中に の例外をスローします。
private String getField();public String setField(String x);「org.bson.codecs.configuration.CodecConfigurationException: クラス X のコーデックが見つかりません。」を修正するにはどうすればよいですか。
この例外は、クラスのコーデックを登録する必要があることを意味します。