Spring、Hibernate、そしてJNDIデータソース

1概要

この記事では、Hibernate/JPAを使用してhttps://en.wikipedia.org/wiki/Java Naming and Directory Interface[JNDI]データソースを使用してSpringアプリケーションを作成します。

SpringとHibernateの基本を再発見したい場合は、link:/永続層 - 春とjpa[この記事]を調べてください。

2データソースの宣言

2.1. システム

JNDIデータソースを使用しているので、それをアプリケーションで定義するのではなく、アプリケーションコンテナで定義します。

この例では、8.5.xバージョンのhttp://tomcat.apache.org/[Tomcat]と9.5.xバージョンのhttps://www.postgresql.org/[PostgreSQL]データベースを使用します。 。

他のJavaアプリケーションコンテナと選択したデータベースを使用して、同じ手順を複製できるはずです(適切なJDBC jarがある限り)。

2.2. アプリケーションコンテナでデータソースを宣言する

データソースは、 <GlobalNamingResources> 要素内の <tomcat home>/conf/server.xml__ファイルで宣言します。

データベースサーバーがアプリケーションコンテナと同じマシン上で実行されており、目的のデータベースの名前が postgres で、ユーザー名が baeldung 、パスワードが pass1234 の場合、リソースは次のようになります。

<Resource name="jdbc/BaeldungDatabase"
  auth="Container"
  type="javax.sql.DataSource"
  driverClassName="org.postgresql.Driver"
  url="jdbc:postgresql://localhost:5432/postgres"
  username="baeldung"
  password="pass1234"
  maxTotal="20"
  maxIdle="10"
  maxWaitMillis="-1"/>

ここでは、リソースの名前を jdbc/BaeldungDatabase にしました。これは、このデータソースを参照するときに使用される名前になります。

その型とデータベースドライバのクラス名も指定する必要があります。これが機能するためには、対応するjarも <tomcat home>/lib/__に配置する必要があります(この場合は、PostgreSQLのJDBC jar)。

残りの設定パラメータは以下のとおりです。

  • auth =” Container” - コンテナがサインオンすることを意味します

アプリケーションに代わってリソースマネージャ ** maxTotal、maxIdle、 、および maxWaitMillis - プール接続の

設定パラメータ

また、 <tomcat home>/conf/context.xmlの <Context> 要素内に ResourceLink を定義する必要があります。

<ResourceLink
  name="jdbc/BaeldungDatabase"
  global="jdbc/BaeldungDatabase"
  type="javax.sql.DataSource"/>

server.xml Resource で定義した名前を使用していることに注意してください。

** 3リソースを使う

3.1. アプリケーションを設定する

今度は、純粋なJava構成を使用して単純なSpring JPA Hibernateアプリケーションを定義します。

まず、Springのコンテキストの設定を定義することから始めます(ここではJNDIに焦点を当てており、あなたは既にSpringの設定の基本を知っていると仮定しています)。

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:persistence-jndi.properties")
@ComponentScan("org.baeldung.persistence")
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
public class PersistenceJNDIConfig {

    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory()
      throws NamingException {
        LocalContainerEntityManagerFactoryBean em
          = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());

       //rest of entity manager configuration
        return em;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup(env.getProperty("jdbc.url"));
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

   //rest of persistence configuration
}

リンクの設定の完全な例があることに注意してください。

dataSource Beanを作成するには、アプリケーションコンテナで定義したJNDIリソースを探す必要があります。これを persistence-jndi.properties キーに格納します(他のプロパティもあります)。

jdbc.url=java:comp/env/jdbc/BaeldungDatabase

jdbc.urlプロパティ では、検索するルート名を定義しています。 java:comp/env/ (これはデフォルトで、コンポーネントと環境に対応します)、そして server.xml で使用したのと同じ名前:

jdbc/BaeldungDatabase

3.2. JPA構成 - モデル、DAO、およびサービス

生成された id name を持つ @ Entity アノテーションを持つ単純なモデルを使用します。

@Entity
public class Foo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

   //default getters and setters
}

簡単なリポジトリを定義しましょう。

@Repository
public class FooDao {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Foo> findAll() {
        return entityManager
          .createQuery("from " + Foo.class.getName()).getResultList();
    }
}

そして最後に、簡単なサービスを作成しましょう。

@Service
@Transactional
public class FooService {

    @Autowired
    private FooDao dao;

    public List<Foo> findAll() {
        return dao.findAll();
    }
}

これで、SpringアプリケーションでJNDIデータソースを使用するために必要なものがすべて揃いました。

4結論

この記事では、JNDIデータソースと連携するJPA Hibernate設定を使用して、Springアプリケーションの例を作成しました。

最も重要な部分は、アプリケーションコンテナ内のリソースの定義と設定上のJNDIリソースの検索です。

そしていつものように、完全なプロジェクトはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa[GitHubに載っています]