Spring、Hibernate和JNDI数据源

2023/05/18

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,资源将如下所示:

<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 – 是池连接的配置参数

我们还必须在/conf/context .xml中的元素内定义一个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("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
}

请注意,我们在Spring 4 and JPA with Hibernate一文中提供了配置的完整示例。

为了创建我们的数据源 bean,我们需要查找我们在应用程序容器中定义的 JNDI 资源。我们会将其存储在persistence-jndi.properties键(以及其他属性)中:

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

请注意,在jdbc.url 属性中,我们定义了一个要查找的根名称:java:comp/env/ (这是默认值,对应于组件和环境),然后是我们在server.xml中使用的相同名称:jdbc/ Baeldung 数据库。

3.2. JPA 配置——模型、DAO 和服务

我们将使用一个带有@Entity注解的简单模型以及生成的id和name:

@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. 总结

在本文中,我们创建了一个示例 Spring 应用程序,该应用程序具有 JPA + Hibernate 设置并使用 JNDI 数据源。

请注意,最重要的部分是应用程序容器中资源的定义和配置中 JNDI 资源的查找。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章