Как настроить имя схемы по умолчанию в конфигурации JPA?
Я обнаружил, что в конфигурационном файле 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>
... но я не могу найти его имя в Google. Есть идеи?
4 ответа
Также не знаю свойства JPA. Но вы можете просто добавить свойство Hibernate (при условии, что вы используете Hibernate в качестве поставщика) как
...
<property name="hibernate.default_schema" value="myschema"/>
...
Hibernate должен забрать это
Просто чтобы сэкономить время людей, которые приходят на почту (как я, кто ищет тип конфигурации 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>
PS: Для hibernate.hdm2ddl.auto, вы можете посмотреть в посте Hibernate hbm2ddl.auto возможные значения и что они делают? Я привык устанавливать create-update, потому что это удобно. Однако в производственной среде, я думаю, лучше взять контроль над ddl, поэтому я беру все, что ddl генерирует в первый раз, сохраняю его, а не позволяю ему автоматически создавать и обновлять.
Для тех, кто использует Spring-Boot, на основе конфигурации Java,
Я устанавливаю значение схемы в application.properties
spring.jpa.properties.hibernate.dialect=...
spring.jpa.properties.hibernate.default_schema=...
Во избежание жесткого кодирования схемы в Java-классах сущности JPA мы использовали файл сопоставления orm.xml в приложении Java EE, развернутом в OracleApplicationServer10 (OC4J,Orion). Он лежит в 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>
...
Содержимое файла 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>
Для тех, кто использует последние версии весенней загрузки, поможет это:
.properties:
spring.jpa.properties.hibernate.default_schema=<name of your schema>
.yml:
spring:
jpa:
properties:
hibernate:
default_schema: <name of your schema>
Мне пришлось установить значение в '' и ""
spring:
jpa:
properties:
hibernate:
default_schema: '"schema"'
Использовать этот
@Table (name = "Test", schema = "\"schema\"")
вмешательство @Table (name = "Test", schema = "schema")
Если вы используете postgresql, запрос будет следующим:
SELECT * FROM "schema".test
нет:
SELECT * FROM schema.test
PS: Тест - это таблица
Если вы используете (org.springframework.jdbc.datasource.DriverManagerDataSource)
в ApplicationContext.xml
чтобы указать сведения о базе данных, используйте нижеприведенное простое свойство, чтобы указать схему.
<property name="schema" value="schemaName" />