Java 在persistence.xml和spring配置文件中配置数据源的区别

Java 在persistence.xml和spring配置文件中配置数据源的区别,java,spring,jpa,persistence,Java,Spring,Jpa,Persistence,我从两个方面看到(并完成)了数据源配置(下面的代码仅用于演示): 1) 持久化单元内的配置,如: <persistence-unit name="LocalDB" transaction-type="RESOURCE_LOCAL"> <class>domain.User</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <pr

我从两个方面看到(并完成)了数据源配置(下面的代码仅用于演示):

1) 持久化单元内的配置,如:

<persistence-unit name="LocalDB" transaction-type="RESOURCE_LOCAL">
    <class>domain.User</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.c3p0.min_size" value="5"/>
        ....
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>
</persistence-unit>

域。用户
真的
....
2) spring配置文件内的配置(如applicationContext.xml):


.....

问题是:每种方式都有利弊吗,还是只是口味的问题?

这完全是个人喜好


如果您已经在使用Spring,我的建议是使用Spring的配置。它的目的是依赖项注入和管理,所以让它完成与数据库依赖项相关的工作。然而,如果您还没有使用Spring,请坚持使用持久性配置,因为这将使您的项目更简单,同时仍然可以正常工作。不过,我建议,任何需要Hibernate与数据库交互的项目可能都足够大,可以允许在其中使用Spring。

如果您在JavaEE容器中,则会产生巨大的差异。

除了个人偏好之外,如果你遵循第二种方法并进行一些修改,你会过得更好

在第一种情况下,您正在创建自己的连接池,并且不从容器中现有的连接池中获利。因此,即使您将容器配置为(比如)最多20个到数据库的同时连接,您也不能保证这个最大值,因为这个新连接池不受您的配置限制。而且,您不会从容器提供的任何监控工具中获益

在第二种情况下,您也在创建自己的连接池,其缺点与上述相同。但是,您可以隔离这个Springbean的定义,并且只在测试运行中使用它

最好的方法是通过JNDI查找容器的连接池。然后确保尊重容器中的数据源配置

用于运行测试。

.....
在部署到JavaEE容器时使用此选项

  • 记住设置
  • 尽管Tomcat不是一个完整的JavaEE容器,但它确实通过JNDI管理数据源,所以这个答案仍然适用

再次思考您的问题:您的实际问题不是更像“春天的好处是什么?”吗?听起来好像您没有看到它。扪心自问:你为什么要使用它?@BalusC:我不知道这些配置在启动时是如何转换成
entityManagerFactory
的。如果同样的事情发生了,那么我的问题的答案将是
这是一个品味的问题
。如果发生了一些不同的事情,那么我想知道其中的区别。我不会把使用Spring称为“品味问题”。你使用它有一个理由:国际奥委会。实际上,我发布了一个答案,上面写着“如果你使用Spring和/或想要IoC(这是Spring的工作),那么就选择Spring,否则就选择“普通”JPA。”但我在仔细考虑了你的问题后删除了它,因为实际问题似乎比这更深。@BalusC:好的,我看到答案,如果它存在,就不在表面上了。但是,您能告诉我,在使用Spring和JPA的项目中,您将数据源配置放在哪里(如果您使用这两种技术的话)?我不使用Spring:)如果我使用它,我会让Spring管理它。然后你可以利用它的IoC能力。但是,我想知道你是否已经考虑过了,我只是不会为显而易见的先生踢球。顺便说一句:删除的答案在10K+内可见,无论如何都不可删除。谢谢!说得好!很长一段时间以来,我只使用Tomcat,但我当前的项目部署在Glassfish中,您的建议解释了为什么有些东西是以这种方式制作的。
<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="JiraManager"/>
    <property name="dataSource" ref="domainDataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false"/>
            <property name="showSql" value="false"/>
            <property name="databasePlatform" value="${hibernate.dialect}"/>
        </bean>
    </property>
</bean>

<bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${db.driver}" />
    <property name="jdbcUrl" value="${datasource.url}" />
    <property name="user" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    <property name="initialPoolSize" value="5"/>
    <property name="minPoolSize" value="5"/>
    .....
</bean>
<!-- datasource-test.xml -->
<bean id="domainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   <property name="driverClass" value="${db.driver}" />
   <property name="jdbcUrl" value="${datasource.url}" />
   <property name="user" value="${datasource.username}" />
   <property name="password" value="${datasource.password}" />
   <property name="initialPoolSize" value="5"/>
   <property name="minPoolSize" value="5"/>
.....
</bean>
<!-- datasource.xml -->
<jee:jndi-lookup id="domainDataSource" jndi-lookup="jndi/MyDataSource" />