Spring, Hibernate e uma fonte de dados JNDI
1. Visão geral
Neste artigo, criaremos um aplicativo Spring usando Hibernate / JPA com uma fonte de dadosJNDI.
Se você quiser redescobrir o básico do Spring e do Hibernate, verifiquethis article.
2. Declarando a fonte de dados
2.1. Sistema
Como estamos usando uma fonte de dados JNDI, não vamos defini-la em nosso aplicativo, vamos defini-la em nosso contêiner de aplicativo.
Neste exemplo, vamos usar a versão 8.5.x deTomcate a versão 9.5.x do banco de dadosPostgreSQL.
Você deve ser capaz de replicar as mesmas etapas usando qualquer outro contêiner de aplicativo Java e um banco de dados de sua escolha (desde que você tenha jarros JDBC adequados!).
2.2. Declarando a fonte de dados no contêiner do aplicativo
Declararemos nossa fonte de dados no arquivo<tomcat_home>/conf/server.xml dentro do elemento<GlobalNamingResources>.
Supondo que o servidor de banco de dados está sendo executado na mesma máquina que o contêiner do aplicativo, e que o banco de dados pretendido se chamapostgres, e que o nome de usuário éexample com senhapass1234, um recurso parece com isso:
Observe que nomeamos nosso recursojdbc/exampleDatabase. Esse será o nome a ser usado ao fazer referência a essa fonte de dados.
Também tivemos que especificar o tipo e o nome da classe do driver de banco de dados. Para que funcione, você também deve colocar o jar correspondente em<tomcat_home>/lib/ (neste caso, o jar JDBC do PostgreSQL).
Os parâmetros de configuração restantes são:
-
auth=”Container” - significa que o contêiner se conectará ao gerenciador de recursos em nome do aplicativo
-
maxTotal, maxIdle, emaxWaitMillis - são os parâmetros de configuração da conexão do pool
Devemos também definir umResourceLink dentro do elemento<Context> em<tomcat_home>/conf/context.xml, que se pareceria com:
Observe que estamos usando o nome que definimos em nossoResource emserver.xml.
3. Usando o recurso
3.1. Configurando o aplicativo
Vamos definir um aplicativo Spring + JPA + Hibernate simples usando a configuração Java pura agora.
Vamos começar definindo a configuração do contexto do Spring (tenha em mente que estamos nos concentrando no JNDI aqui e assumindo que você já conhece os fundamentos da configuração do 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
}
Observe que temos um exemplo completo da configuração no artigoSpring 4 and JPA with Hibernate.
Para criar nosso beandataSource, precisamos procurar o recurso JNDI que definimos em nosso contêiner de aplicativo. Vamos armazenar isso na chavepersistence-jndi.properties (entre outras propriedades):
jdbc.url=java:comp/env/jdbc/exampleDatabase
Observe que emjdbc.url property estamos definindo um nome de raiz para procurar:java:comp/env/ (esses são os padrões e correspondem a componente e ambiente) e, em seguida, o mesmo nome que usamos emserver.xml: jdbc/exampleDatabase.
3.2. Configuração JPA - Modelo, DAO e Serviço
Vamos usar um modelo simples com a anotação@Entity com umide umname gerado:
@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
}
Vamos definir um repositório simples:
@Repository
public class FooDao {
@PersistenceContext
private EntityManager entityManager;
public List findAll() {
return entityManager
.createQuery("from " + Foo.class.getName()).getResultList();
}
}
E, por último, vamos criar um serviço simples:
@Service
@Transactional
public class FooService {
@Autowired
private FooDao dao;
public List findAll() {
return dao.findAll();
}
}
Com isso, você tem tudo o que precisa para usar sua fonte de dados JNDI em seu aplicativo Spring.
4. Conclusão
Neste artigo, criamos um aplicativo Spring de exemplo com uma configuração JPA + Hibernate trabalhando com uma fonte de dados JNDI.
Observe que as partes mais importantes são a definição do recurso no contêiner do aplicativo e a pesquisa do recurso JNDI na configuração.
E, como sempre, o projeto completo pode ser encontradoover on GitHub.