如何在JPA配置中设置默认架构名称?

Rom*_*man 58 java configuration spring hibernate jpa

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

<hibernate-configuration> 
   <session-factory>
      ...
      <property name="hibernate.default_schema">myschema</property>
      ...
   </session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

据我所知,这个参数应该在这部分配置的某个地方:

<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>
Run Code Online (Sandbox Code Playgroud)

...但我在谷歌找不到它的名字.有任何想法吗?

ber*_*ert 76

也不知道JPA财产.但你可以添加Hibernate属性(假设你使用Hibernate作为提供者)

...

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

...
Run Code Online (Sandbox Code Playgroud)

Hibernate应该选择它

  • 应该添加到`persistence.xml`中持久单元的`<properties>`部分. (2认同)
  • 抱歉,没有看到你没有persistence.xml但是使用Spring来配置Hibernate/JPA.我会尝试在HibernateJpaVendorAdapter下添加它作为属性.也许即使没有"冬眠".在名字前面. (2认同)

小智 34

只是为了节省来到帖子的人的时间(像我一样,寻找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>
Run Code Online (Sandbox Code Playgroud)

Ps:对于hibernate.hdm2ddl.auto,您可以查看Hibernate hbm2ddl.auto的可能值以及它们的作用吗? 我习惯于设置create-update,因为它很方便.但是,在生产中,我认为最好控制ddl,所以我采取任何ddl生成的第一次,保存它,而不是让它自动创建和更新.


gra*_*nit 26

为了避免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>
     <mapping-file>META-INF/orm.xml</mapping-file>
...
Run Code Online (Sandbox Code Playgroud)

文件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>
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这种解决方案,因为它是标准的而不是特定于实现的. (3认同)

小智 16

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

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

spring.jpa.properties.hibernate.dialect=...
spring.jpa.properties.hibernate.default_schema=...
Run Code Online (Sandbox Code Playgroud)


S.D*_*eko 9

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

。特性:

spring.jpa.properties.hibernate.default_schema=<name of your schema>
Run Code Online (Sandbox Code Playgroud)

.yml:

spring:
    jpa:
        properties:
            hibernate:
                default_schema: <name of your schema>
Run Code Online (Sandbox Code Playgroud)


the*_*dog 5

我必须在“”和“”中设置值

spring:
   jpa:
     properties:
       hibernate:
          default_schema: '"schema"'
Run Code Online (Sandbox Code Playgroud)