1. 概要

この記事では、JNDIデータソースでHibernate/JPAを使用してSpringアプリケーションを作成します。

SpringとHibernateの基本を再発見したい場合は、この記事をチェックしてください。

2. データソースの宣言

2.1. システム

JNDIデータソースを使用しているため、アプリケーションでは定義せず、アプリケーションコンテナで定義します。

この例では、8.5.xバージョンのTomcatと9.5.xバージョンのPostgreSQLデータベースを使用します。

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

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

データソースをで宣言します / conf / server.xml 内部のファイルエレメント。

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

<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ファイルもに配置する必要があります / lib / (この場合、PostgreSQLのJDBC jar)。

残りの構成パラメーターは次のとおりです。

  • auth =” Container” –コンテナーがアプリケーションに代わってリソースマネージャーにサインオンすることを意味します
  • maxTotal、maxIdle、および maxWaitMillis –プール接続の構成パラメーターです

また、 ResourceLinkの要素 / conf / context .xml、 これは次のようになります:

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

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

3. リソースの使用

3.1. アプリケーションの設定

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

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

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:persistence-jndi.properties")
@ComponentScan("com.baeldung.hibernate.cache")
@EnableJpaRepositories(basePackages = "com.baeldung.hibernate.cache.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
}

Spring4およびJPAwithHibernateの記事に構成の完全な例があることに注意してください。

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、およびサービス

生成されたidnameを持つ@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リソースのルックアップであることに注意してください。

そして、いつものように、完全なプロジェクトはGitHubにあります。