2010-04-29 7 views
44

ho scoperto che nel file di configurazione di ibernazione potremmo impostare il parametro hibernate.default_schema:Come impostare il nome dello schema predefinito nella configurazione JPA?

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

ora sto usando JPA e voglio fare lo stesso. Altrimenti devo aggiungere il parametro schema per ciascuna annotazione @Table come:

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

quanto ho capito questo parametro deve essere da qualche parte in questa parte della configurazione:

<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> 

... ma non posso trova il suo nome in google. Qualche idea?

risposta

62

Non conosco la proprietà JPA anche per questo. Ma si può solo aggiungere la proprietà Hibernate (a patto di utilizzare Hibernate come provider) come

... 

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

... 

Hibernate dovrebbe raccogliere che fino

+2

dovrebbe essere aggiunto alla sezione '' in unità persistente 'persistenza. xml'. – Roman

+2

Spiacente, non ho visto che non hai persistence.xml ma usa Spring per configurare Hibernate/JPA. Vorrei provare ad aggiungere questo sotto l'HibernateJpaVendorAdapter come una proprietà. Forse anche senza "ibernazione". di fronte al nome. – bert

+1

Il problema qui è che non posso usare una proprietà come nei file Spring, come $ {jdbc.schema} o simili. – Chexpir

25

Al fine di evitare hardcoding schema in classi APP Entità Java abbiamo utilizzato la mappatura orm.xml file nell'applicazione Java EE distribuita in OracleApplicationServer10 (OC4J, Orion). Si trova in model.jar/META-INF/così come persistence.xml. orm.xml file di mapping viene fatto riferimento da peresistence.xml con tag

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

contenuti orm.xml File è citato qui di seguito:

<?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> 
+2

Preferirei questa soluzione rispetto alle altre poiché è standard e non specifica per l'implementazione. – Isaac

+0

Ho ottenuto parseexceptino - necessario per rimuovere l'elemento provider dall'unità di persistenza META-INF/orm.xml ... –

31

solo per risparmiare tempo di persone che vengono al post (come me , chi cerca il tipo di configurazione Spring e vuole che il nome dello schema sia impostato da una fonte esterna (file delle proprietà)). La configurazione lavorerà per voi è

<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> 

Ps: Per il hibernate.hdm2ddl.auto, si poteva guardare nel post Hibernate hbm2ddl.auto possible values and what they do? ho usato per impostare create-update, perché è conveniente. Tuttavia, in produzione, penso che sia meglio prendere il controllo del ddl, quindi prendo tutto ciò che genera ddl la prima volta, lo salvo, invece di lasciarlo automaticamente creare e aggiornare.

+1

E tu sei un salvatore amico mio! :) –

6

Per gli altri che utilizzano la primavera-boot, configurazione basata su Java,

ho impostato il valore di schema in application.properties

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