【问题标题】:How to set up default schema name in JPA configuration?如何在 JPA 配置中设置默认模式名称?
【发布时间】:2011-02-13 19:27:30
【问题描述】:

我发现在hibernate配置文件中我们可以设置参数hibernate.default_schema:

<hibernate-configuration> 
   <session-factory>
      ...
      <property name="hibernate.default_schema">myschema</property>
      ...
   </session-factory>
</hibernate-configuration>

现在我正在使用 JPA,我也想做同样的事情。否则我必须将参数 schema 添加到每个 @Table 注释中,例如:

@Entity
@Table (name = "projectcategory", schema = "SCHEMANAME")
public class Category implements Serializable { ... }

据我了解,此参数应该在这部分配置中:

<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"/>
    <property name="maxPoolSize" value="15"/>
    <property name="checkoutTimeout" value="10000"/>
    <property name="maxStatements" value="150"/>
    <property name="testConnectionOnCheckin" value="true"/>
    <property name="idleConnectionTestPeriod" value="50"/>
</bean>

...但我在谷歌上找不到它的名字。有什么想法吗?

【问题讨论】:

    标签: java hibernate spring configuration jpa


    【解决方案1】:

    也不知道这方面的 JPA 属性。但是您可以将 Hibernate 属性(假设您使用 Hibernate 作为提供程序)添加为

    ...
    
    <property name="hibernate.default_schema" value="myschema"/>
    
    ...
    

    Hibernate 应该会选择它

    【讨论】:

    • 应该添加到persistence.xml的持久单元中的&lt;properties&gt;部分。
    • 对不起,没有看到你没有persistence.xml,而是使用Spring配置Hibernate/JPA。我会尝试在 HibernateJpaVendorAdapter 下添加它作为属性。甚至可能没有“休眠”。在名字前面。
    • 这里的问题是我不能使用 Spring 文件中的属性,如 ${jdbc.schema} 或类似的。
    • 在@formula元素中,hibernate不包含shema,在sqlserver中查询失败stackoverflow.com/questions/51088034/…
    【解决方案2】:

    为了避免在 JPA 实体 Java 类中对模式进行硬编码,我们在 OracleApplicationServer10(OC4J,Orion)中部署的 Java EE 应用程序中使用了 orm.xml 映射文件。 它位于 model.jar/META-INF/ 以及 persistence.xml 中。映射文件 orm.xml 是从 peresistence.xml 中引用的,带有标签

    ...
      <persistence-unit name="MySchemaPU"  transaction-type="JTA">
        <provider>...</provider>
        <mapping-file>META-INF/orm.xml</mapping-file>
    ...
    

    文件orm.xml内容引用如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                     version="1.0">
    
      <persistence-unit-metadata>
        <persistence-unit-defaults>
          <schema>myschema</schema>
        </persistence-unit-defaults>
      </persistence-unit-metadata>
    </entity-mappings>
    

    【讨论】:

    • 我更喜欢这个解决方案而不是其他解决方案,因为它是标准的而不是特定于实现的。
    • 我得到了 parseexceptino - 需要从持久性单元中删除提供程序元素 META-INF/orm.xml ...
    【解决方案3】:

    只是为了节省来帖子的人的时间(像我一样,他们正在寻找 Spring 配置类型并希望您的架构名称由外部源(属性文件)设置)。配置将适用于您是

    <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>
        <property name="jpaProperties">
           <props>
                <prop key="hibernate.hbm2ddl.auto">none</prop>
                <prop key="hibernate.default_schema">${yourSchema}</prop>
           </props>
    </property>
    
    </bean>
    

    附: 对于 hibernate.hdm2ddl.auto,您可以查看帖子 Hibernate hbm2ddl.auto possible values and what they do? 我习惯设置create-update,因为它很方便。但是,在生产中,我认为最好控制 ddl,所以我将第一次生成的任何 ddl 保存,而不是让它自动创建和更新。

    【讨论】:

      【解决方案4】:

      对于使用 spring-boot、基于 java 的配置的其他人,

      我在 application.properties 中设置了架构值

      spring.jpa.properties.hibernate.dialect=...
      spring.jpa.properties.hibernate.default_schema=...
      

      【讨论】:

        【解决方案5】:

        对于那些使用最新版本的 spring boot 的人会有所帮助:

        .properties:

        spring.jpa.properties.hibernate.default_schema=<name of your schema>
        

        .yml:

        spring:
            jpa:
                properties:
                    hibernate:
                        default_schema: <name of your schema>
        

        【讨论】:

          【解决方案6】:

          使用这个

          @Table (name = "Test", schema = "\"schema\"")
          

          代替@Table (name = "Test", schema = "schema")

          如果你在 postgresql 上,请求是:

          SELECT * FROM "schema".test 
          

          不是:

          SELECT * FROM schema.test
          

          PS:测试是一张表

          【讨论】:

            【解决方案7】:

            我必须在 '' 和 "" 中设置值

            spring:
               jpa:
                 properties:
                   hibernate:
                      default_schema: '"schema"'
            

            【讨论】:

              【解决方案8】:

              如果您在ApplicationContext.xml 中使用(org.springframework.jdbc.datasource.DriverManagerDataSource) 来指定数据库详细信息,请使用以下简单属性来指定架构。

              <property name="schema" value="schemaName" />
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-08-17
                • 1970-01-01
                • 2014-12-13
                • 1970-01-01
                • 2019-11-28
                • 1970-01-01
                • 2021-12-03
                • 2015-03-28
                相关资源
                最近更新 更多