Я борюсь с сопоставлением синонимов Oracle с объектами JPA.
В качестве фона скажу, что мне нужно сделать это возможным как на сервере tomcat 7, так и на JBoss EAP 6.4. Ниже вы найдете фрагмент моей конфигурации постоянства.
- Поиск источника данных (найден jndi, привязан к источнику данных)
@Bean
public DataSource datasource() throws NamingException{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/PAMGODW_DS");
return ds;
}
- LocalSessionFactoryBean (кажется, работает):
@Bean
public LocalSessionFactoryBean sessionFactory() throws NamingException, IOException{
Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
props.put("hibernate.synonyms", "true");
props.put("hibernate.connection.includeSynonyms", "true");
LocalSessionFactoryBean f = new LocalSessionFactoryBean();
f.setDataSource(datasource());
f.setPackagesToScan(new String[]{"com.roche.nrimini.pam.domain.entity", "com.roche.nrimini.pam.domain.service", "com.roche.nrimini.pam.domain.repository"});
f.setHibernateProperties(props);
f.setJtaTransactionManager(jtaTransactionManager());
f.setAnnotatedPackages(new String[]{"com.roche.nrimini.pam.domain.entity", "com.roche.nrimini.pam.domain.service", "com.roche.nrimini.pam.domain.repository"});
f.afterPropertiesSet();
System.out.println("LOCALSESSIONFACTORY BEAN");
return f;}
- JtaTransactionManager (кажется, тоже в порядке):
@Bean
public TransactionManager jtaTransactionManager(){
JtaTransactionManager manager = new JtaTransactionManager();
return manager.getTransactionManager();
}
- Объект @Table(name="V_TABLE_SYN") фактически указывает на синоним Oracle:
@Entity
@Table(name = "V_TABLE_SYN")
public class SomeSynonym implements Serializable {
// @Id and @Column mappings here
Что я получаю, когда пытаюсь запросить объекты Entity, так это ORA-00942 Таблица или представление не существует.
В среде JBoss моя конфигурация источника данных в файле standalone.xml выглядит так:
<datasource jta="false" jndi-name="java:jboss/PAMGODW_DS" pool-name="PAMGODW_DS" enabled="true" use-ccm="false">
<connection-url>jdbc:oracle:thin:@someserver/some_service</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<connection-property name="includeSynonyms">
true
</connection-property>
<driver>oracle</driver>
<pool>
<min-pool-size>0</min-pool-size>
<max-pool-size>10</max-pool-size>
</pool>
<security>
<user-name>some_user</user-name>
<password>a_pass</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</datasource>
В Tomcat я получил:
<Resource name="jdbc/SOME_DS" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@some_server/some_service"
username="some_user" password="a_pass" maxActive="20" maxIdle="10"
maxWait="-1">
Я слышал и читал о свойстве include.synonyms, но, похоже, оно не работает, а в Tomcat env я понятия не имел, как его установить.
Помогите, может у кого-то была похожая проблема.