1概要

ほとんどのJPA駆動型アプリケーションは、http://hibernate.org/[Hibernate]やhttp://openjpa.apache.org/[OpenJPAのように、JPA実装を取得するために

“ persistence.xml”

ファイルを多用しています。]。

ここでの私たちのアプローチは、一つ以上のhttps://docs.oracle.com/cd/E19798-01/821-1841/bnbrj/index.html


と関連するhttpsを設定するための集中メカニズムを提供します//docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch03.html[永続コンテキスト]。

そして、このアプローチは本質的に間違っているわけではありませんが、異なるパーシスタンスユニットを使用するアプリケーションコンポーネントを単独でテストする必要があるユースケースには適していません。

明るい面では、

単純なJava

を使用するだけで、__ persistence.xmlファイルを使用せずにJPA実装をブートストラップすることができます。

このチュートリアルでは、Hibernateを使ってこれを実現する方法を説明します。


2

PersistenceUnitInfo

インターフェースの実装

典型的な「xmlベースの」JPA設定では、JPA実装は自動的に

永続化プロバイダはこの実装を使用してエンティティマネージャファクトリを作成します。この工場から、私たちはエンティティマネージャを入手することができます。

私たちがする必要があるのは彼が最初に頼ることはしないので、私たち自身の____実装を提供することです。

public class HibernatePersistenceUnitInfo implements PersistenceUnitInfo {

    public static String JPA__VERSION = "2.1";
    private String persistenceUnitName;
    private PersistenceUnitTransactionType transactionType
      = PersistenceUnitTransactionType.RESOURCE__LOCAL;
    private List<String> managedClassNames;
    private List<String> mappingFileNames = new ArrayList<>();
    private Properties properties;
    private DataSource jtaDataSource;
    private DataSource nonjtaDataSource;
    private List<ClassTransformer> transformers = new ArrayList<>();

    public HibernatePersistenceUnitInfo(
      String persistenceUnitName, List<String> managedClassNames, Properties properties) {
        this.persistenceUnitName = persistenceUnitName;
        this.managedClassNames = managedClassNames;
        this.properties = properties;
    }

   //standard setters/getters
}

一言で言えば、

HibernatePersistenceUnitInfo

クラスは単なるプレーンなデータコンテナで、特定の永続ユニットにバインドされた設定パラメータを格納します。これには、持続性ユニット名、管理対象エンティティクラスの名前、トランザクションタイプ、JTAおよびJTA以外のデータソースなどが含まれます。


3 Hibernateの

EntityManagerFactoryBuilderImpl

クラスを使用したEntity Managerファクトリの作成

カスタムの

PersistenceUnitInfo

実装が整ったので、最後にエンティティマネージャファクトリを取得する必要があります。

  • Hibernateはこのプロセスを簡単にします。https://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.html[

    EntityManagerFactoryBuilderImpl

    ]クラス(適切な実装)ビルダーパターン)** 。

より高度な抽象化を提供するために、

EntityManagerFactoryBuilderImpl.

の機能をラップするクラスを作成しましょう。

最初に、

HibernateのEntityManagerFactoryBuilderImpl

クラスと

__HibernatePersistenceUnitInf

__oクラスを使用して、

エンティティマネージャファクトリとエンティティマネージャ

を作成することに注意を払うメソッドを紹介しましょう。

public class JpaEntityManagerFactory {
    private String DB__URL = "jdbc:mysql://databaseurl";
    private String DB__USER__NAME = "username";
    private String DB__PASSWORD = "password";
    private Class[]entityClasses;

    public JpaEntityManagerFactory(Class[]entityClasses) {
        this.entityClasses = entityClasses;
    }

    public EntityManager getEntityManager() {
        return getEntityManagerFactory().createEntityManager();
    }

    protected EntityManagerFactory getEntityManagerFactory() {
        PersistenceUnitInfo persistenceUnitInfo = getPersistenceUnitInfo(
          getClass().getSimpleName());
        Map<String, Object> configuration = new HashMap<>();
        return new EntityManagerFactoryBuilderImpl(
          new PersistenceUnitInfoDescriptor(persistenceUnitInfo), configuration)
          .build();
    }

    protected HibernatePersistenceUnitInfo getPersistenceUnitInfo(String name) {
        return new HibernatePersistenceUnitInfo(name, getEntityClassNames(), getProperties());
    }

   //additional methods
}

次に、

EntityManagerFactoryBuilderImpl



__HibernatePersistenceUnitInf

__o

に必要なパラメータを提供する

メソッドを見てみましょう。

これらのパラメータには、管理エンティティクラス、エンティティクラスの名前、Hibernateの設定プロパティ、および

MysqlDataSource

オブジェクトが含まれます。

public class JpaEntityManagerFactory {
   //...

    protected List<String> getEntityClassNames() {
        return Arrays.asList(getEntities())
          .stream()
          .map(Class::getName)
          .collect(Collectors.toList());
    }

    protected Properties getProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.id.new__generator__mappings", false);
        properties.put("hibernate.connection.datasource", getMysqlDataSource());
        return properties;
    }

    protected Class[]getEntities() {
        return entityClasses;
    }

    protected DataSource getMysqlDataSource() {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL(DB__URL);
        mysqlDataSource.setUser(DB__USER__NAME);
        mysqlDataSource.setPassword(DB__PASSWORD);
        return mysqlDataSource;
    }
}

わかりやすくするために、

JpaEntityManagerFactory

クラス内でデータベース接続パラメータをハードコードしました。ただし、プロダクション環境では、これらを別々のプロパティファイルに保存する必要があります。

さらに、

getMysqlDataSource()

メソッドは完全に初期化された

MysqlDataSource

オブジェクトを返します。

私たちは物事をたどりやすくするためだけにこれをしました。より現実的な疎結合設計では、


_EntityManagerFactoryBuilderImpl ‘を使用して

DataSource

オブジェクトをインジェクトします。 .html#withDataSource-javax.sql.DataSource – [

withDataSource()_

]メソッド。クラス内で作成するのではなく** 。


4 Entity Managerを使用したCRUD操作の実行

最後に、JPAエンティティマネージャを取得してCRUD操作を実行するための

JpaEntityManagerFactory

インスタンスの使用方法を見てみましょう。 (簡潔にするために

User

クラスは省略しています)。

public static void main(String[]args) {
    EntityManager entityManager = getJpaEntityManager();
    User user = entityManager.find(User.class, 1);

    entityManager.getTransaction().begin();
    user.setName("John");
    user.setEmail("[email protected]");
    entityManager.merge(user);
    entityManager.getTransaction().commit();

    entityManager.getTransaction().begin();
    entityManager.persist(new User("Monica", "[email protected]"));
    entityManager.getTransaction().commit();

   //additional CRUD operations
}

private static class EntityManagerHolder {
    private static final EntityManager ENTITY__MANAGER = new JpaEntityManagerFactory(
      new Class[]{User.class})
      .getEntityManager();
}

public static EntityManager getJpaEntityManager() {
    return EntityManagerHolder.ENTITY__MANAGER;
}


5結論

この記事では、従来の方法に頼ることなく、JPAのカスタム実装を使用してプログラムでJPAエンティティマネージャをブートストラップする方法を説明しました。

いつもどおり、この記事に示されているすべてのコード・サンプルは入手可能です。

https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5

[over
GitHubで。