10.2.4. JPA キャッシュストア
JPA (Java Persistence API) キャッシュストア、JpaStore
は正式なスキーマを使用してデータを永続化します。その後、他のアプリケーションは永続ストレージから読み取れ、Data Grid からデータを読み込むことができます。ただし、他のアプリケーションは、Data Grid と同時に永続ストレージを使用しないでください。
JpaStore
を使用する場合は、以下を考慮する必要があります。
- キーはエンティティーの ID である必要があります。値はエンティティーオブジェクトにする必要があります。
-
1 つの
@Id
または@EmbeddedId
アノテーションのみが許可されます。 -
@GeneratedValue
アノテーションを使用した自動生成 ID はサポートされません。 - すべてのエントリーは immortal として保存されます。
-
JpaStore
はセグメンテーションをサポートしていません。
宣言型設定
<local-cache name="vehicleCache"> <persistence passivation="false"> <jpa-store xmlns="urn:infinispan:config:store:jpa:10.1" persistence-unit="org.infinispan.persistence.jpa.configurationTest" entity-class="org.infinispan.persistence.jpa.entity.Vehicle"> /> </persistence> </local-cache>
パラメーター | 説明 |
---|---|
|
JPA エンティティークラスを含む JPA 設定ファイル |
| このキャッシュに保存されることが想定される完全修飾 JPA エンティティークラス名を指定します。1 つのクラスのみが許可されます。 |
プログラムによる設定
Configuration cacheConfig = new ConfigurationBuilder().persistence() .addStore(JpaStoreConfigurationBuilder.class) .persistenceUnitName("org.infinispan.loaders.jpa.configurationTest") .entityClass(User.class) .build();
パラメーター | 説明 |
---|---|
|
JPA エンティティークラスを含む JPA 設定ファイル |
| このキャッシュに保存されることが想定される完全修飾 JPA エンティティークラス名を指定します。1 つのクラスのみが許可されます。 |
10.2.4.1. JPA キャッシュストア使用例
このセクションでは、JPA キャッシュストアを使用する例を紹介します。
前提条件
-
JPA エンティティーをマーシャリングするように Data Grid を設定します。デフォルトでは、DataGrid は Java オブジェクトのマーシャリングに ProtoStream を使用します。JPA エンティティーをマーシャリングするには、
.proto
スキーマおよびマーシャラーをSerializationContext
に登録するSerializationContextInitializer
実装を作成する必要があります。
手順
永続性ユニット "myPersistenceUnit" を
persistence.xml
で定義します。<persistence-unit name="myPersistenceUnit"> ... </persistence-unit>
ユーザーエンティティークラスを作成します。
@Entity public class User implements Serializable { @Id private String username; private String firstName; private String lastName; ... }
JPA キャッシュストアで"usersCache"という名前のキャッシュを設定します。
キャッシュ usersCache を設定して JPA キャッシュストアを使用するように設定できます。これにより、データをキャッシュに配置すると、JPA 設定を基にデータがデータベースに永続化されます。
EmbeddedCacheManager cacheManager = ...; Configuration cacheConfig = new ConfigurationBuilder().persistence() .addStore(JpaStoreConfigurationBuilder.class) .persistenceUnitName("org.infinispan.loaders.jpa.configurationTest") .entityClass(User.class) .build(); cacheManager.defineCache("usersCache", cacheConfig); Cache<String, User> usersCache = cacheManager.getCache("usersCache"); usersCache.put("raytsang", new User(...));
JPA キャッシュストアを使用するキャッシュは、以下の例のように、1 種類のデータのみを保存できます。
Cache<String, User> usersCache = cacheManager.getCache("myJPACache"); // Cache is configured for the User entity class usersCache.put("username", new User()); // Cannot configure caches to use another entity class with JPA cache stores Cache<Integer, Teacher> teachersCache = cacheManager.getCache("myJPACache"); teachersCache.put(1, new Teacher()); // The put request does not work for the Teacher entity class
@EmbeddedId
アノテーションでは、以下の例のように複合キーを使用できます。@Entity public class Vehicle implements Serializable { @EmbeddedId private VehicleId id; private String color; ... } @Embeddable public class VehicleId implements Serializable { private String state; private String licensePlate; ... }