【问题标题】:Priority between properties in HibernateJPAVendorAdapter and JPAPropertyHibernateJPAVendorAdapter 和 JPAProperty 中的属性之间的优先级
【发布时间】:2013-09-12 23:18:51
【问题描述】:

我在应用程序 Spring + JPA + Hibernate 中有以下配置,使用 packagesToScan 来避免文件 persistence.xml。

<!-- Configure JPA Implementation -->
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
      <property name="database" value="${jpa.database}" />
      <property name="showSql" value="${jpa.showSql}" />
      <property name="databasePlatform" value="${jpa.dialect}" />
      <property name="generateDdl" value="${jpa.generateDdl}" />
</bean>

<!-- Create the JPA EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
      <property name="packagesToScan">
           <list>
               <value>com.proyectofinal.model</value>
           </list>
      </property>
      <property name="jpaProperty">  
           <props>  
               <entry key="hibernate.cache.use_second_level_cache" value="true"/>  
               <entry key="hibernate.cache.use_query_cache" value="true"/>  
               <entry key="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>  
               <entry key="hibernate.show_sql" value="true" />  
               <entry key="hibernate.use_sql_comments" value="false" />  
               <entry key="hibernate.format_sql" value="true" />  
               <entry key="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" />  
               <entry key="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>  
           </props>  
      </property>  
</bean>

我的问题是:

  • 是否有必要在这两个地方定义属性,如 show_sql 或 dialect?
  • 哪个优先于另一个?
  • 什么地方更适合定义它?

提前致谢

【问题讨论】:

    标签: java spring hibernate jpa configuration


    【解决方案1】:

    JpaVendorAdapter 中指定的属性不必在附加属性列表中重复。如果是这样,JpaVendorAdapter 将毫无用处。

    同样在您的配置中使用databasedatabasePlatform,不要同时使用。

    可以使用JpaVendorAdapter 配置的属性我会在那里配置,它会为您节省几行代码,并且您不必记住神秘的休眠(或您使用的任何提供程序)属性名称。

    你需要的属性如下。

    <props>  
       <entry key="hibernate.cache.use_second_level_cache" value="true"/>  
       <entry key="hibernate.cache.use_query_cache" value="true"/>  
       <entry key="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>  
       <entry key="hibernate.use_sql_comments" value="false" />  
       <entry key="hibernate.format_sql" value="true" />  
       <entry key="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>  
    </props>  
    

    如果你在这两个地方都定义了它们,JpaVendorAdapter 中的那个会被忽略。

    【讨论】:

      【解决方案2】:

      除了@M。 Deinum 的回答,如果您决定使用jpaProperties 而不是jpaVendorAdapter,则需要设置persistenceProvider 属性,因为它通常派生自jpaVendorAdapter

      例如

      <property name="persistenceProvider">
        <bean class="org.hibernate.ejb.HibernatePersistence"/>
      </property>
      

      另外,jpaProperty 应该是 jpaProperties

      【讨论】:

      • 感谢您的回答!!指定 HibernateJPAVendorAdapter 还不够吗?
      • 我只是说如果你要单独设置jpaProperties而不设置jpaVendorAdaptor,那么你需要设置persistenceProvider。指定一个默认的 jpaVendorAdaptor(即没有属性的)也可能就足够了,尽管我从未尝试过。
      • 很好!!我没有很好地理解。现在我做到了!谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2013-09-30
      相关资源
      最近更新 更多