Spring、Hibernate、およびJNDIデータソース
1. 概要
この記事では、JNDIデータソースでHibernate / JPAを使用してSpringアプリケーションを作成します。
SpringとHibernateの基本を再発見したい場合は、this articleをチェックしてください。
2. データソースの宣言
2.1. システム
JNDIデータソースを使用しているため、アプリケーションで定義するのではなく、アプリケーションコンテナで定義します。
この例では、8.5.xバージョンのTomcatと9.5.xバージョンのPostgreSQLデータベースを使用します。
他のJavaアプリケーションコンテナと選択したデータベースを使用して、同じ手順を複製できるはずです(適切なJDBC jarがあれば!)。
2.2. アプリケーションコンテナでのデータソースの宣言
<GlobalNamingResources>要素内の<tomcat_home>/conf/server.xmlファイルでデータソースを宣言します。
データベースサーバーがアプリケーションコンテナと同じマシンで実行されており、目的のデータベースの名前がpostgresであり、ユーザー名がexampleでパスワードがpass1234であるとすると、リソースは次のようになります。このように見える:
リソースにjdbc/exampleDatabaseという名前を付けていることに注意してください。 これは、このデータソースを参照するときに使用される名前になります。
また、そのタイプとデータベースドライバのクラス名を指定する必要がありました。 これを機能させるには、対応するjarを<tomcat_home>/lib/(この場合はPostgreSQLのJDBC jar)に配置する必要もあります。
残りの構成パラメーターは次のとおりです。
-
auth=”Container” –コンテナーがアプリケーションに代わってリソースマネージャーにサインオンすることを意味します
-
maxTotal, maxIdle,およびmaxWaitMillis –プール接続の構成パラメーターです
また、<tomcat_home>/conf/context.xml,の<Context>要素内にResourceLinkを定義する必要があります。これは次のようになります。
server.xmlのResourceで定義した名前を使用していることに注意してください。
3. リソースの使用
3.1. アプリケーションの設定
ここで、純粋なJava構成を使用して単純なSpring + JPA + Hibernateアプリケーションを定義します。
まず、Springコンテキストの構成を定義することから始めます(ここではJNDIに焦点を当てており、Springの構成の基本をすでに知っていることを前提としています)。
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:persistence-jndi.properties")
@ComponentScan("com.example.hibernate.cache")
@EnableJpaRepositories(basePackages = "com.example.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
}
Spring 4 and JPA with Hibernateの記事に構成の完全な例があることに注意してください。
dataSource Beanを作成するには、アプリケーションコンテナで定義したJNDIリソースを探す必要があります。 これを(他のプロパティの中でも)persistence-jndi.propertiesキーに保存します。
jdbc.url=java:comp/env/jdbc/exampleDatabase
jdbc.url propertyでは、検索するルート名を定義していることに注意してください:java:comp/env/(これはデフォルトであり、コンポーネントと環境に対応します)、次にserver.xmlで使用したのと同じ名前: jdbc/exampleDatabase。
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 findAll() {
return entityManager
.createQuery("from " + Foo.class.getName()).getResultList();
}
}
最後に、簡単なサービスを作成しましょう。
@Service
@Transactional
public class FooService {
@Autowired
private FooDao dao;
public List findAll() {
return dao.findAll();
}
}
これにより、SpringアプリケーションでJNDIデータソースを使用するために必要なものがすべて揃います。
4. 結論
この記事では、JPA + Hibernateセットアップを使用してJNDIデータソースで動作するSpringアプリケーションの例を作成しました。
最も重要な部分は、アプリケーションコンテナ内のリソースの定義と、構成上のJNDIリソースの検索であることに注意してください。
そして、いつものように、完全なプロジェクトはover on GitHubで見つけることができます。