2015-12-09 1 views
1

Мне нужно использовать множители единиц сохранения с различными свойствами (в моем случае базы данных MySQL и Oracle). В файле persistence.xml я определяю две разные единицы персистентности и перечисляю только классы объектов.Могу ли я установить схему перед созданием EntityManager?

свойства могут быть установлены в persitence.xml с

<properties> <property name="..." value="..." /> ...

Im делает его в классе Java, прежде чем создавать EntityManager, потому что я должен использовать различные свойства (которые я читал раньше):

 EntityManagerFactory factory; 
     ... 
     HashMap<String, String> dbProperties = new HashMap<String, String>(); 
     dbProperties.put("javax.persistence.jdbc.driver", driver); 
     dbProperties.put("javax.persistence.jdbc.url", url); 
     dbProperties.put("javax.persistence.jdbc.user", user); 
     dbProperties.put("javax.persistence.jdbc.password", password); 
     dbProperties.put("eclipselink.ddl-generation", "none"); 
     dbProperties.put("eclipselink.ddl-generation.output-mode", "database"); 

     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, dbProperties); 
     EntityManager em = factory.createEntityManager(); 
     ... 

Для Oracle мне нужно динамически устанавливать схему (если возможно), а не жестко закодированную в аннотации @Table в каждом классе Entity.

Сейчас я использую константу (означает, что это не динамически)

@Table(name="MYTABLE", schema = Constants.ORACLE_SCHEMA) 

Я хочу использовать

@Table(name="MYTABLE") 

и установить схему как свойство

dbProperties.put(...) 

ли есть такая собственность?

На моем поиске я нашел синтаксис, который мог бы помочь

ALTER SESSION SET CURRENT_SCHEMA=MYSCHEMA 

Но я не знаю, как совместить его с EntityManager.

Я уже спросил о всех доступных свойствах here, но ничего не смог найти.

Заранее спасибо.

ответ

0

Я нашел решение для этого с помощью этого поста: https://community.oracle.com/thread/2270534?tstart=0

Это может быть сделано с помощью запроса после EntityManager создается:

 ... 
     EntityManager em = factory.createEntityManager(); 
     Query query; 

     em.getTransaction().begin(); 
     query = em.createNativeQuery("ALTER SESSION SET CURRENT_SCHEMA="+schemaName); 
     query.executeUpdate(); 
     em.getTransaction().commit(); 

Проверка текущей схемы с:

 query = em.createNativeQuery("SELECT SYS_CONTEXT('USERENV','SESSION_SCHEMA') FROM DUAL"); 
     System.out.println("Current schema: " + query.getResultList()); 
+0

Не могли бы вы связать схему с пользователем, а затем выбрать пользователя на основе схемы, которую вы хотели использовать? – Chris

+0

Возможно, это решит проблему, но в Tomcat и Weblogic есть что-то, называемое «InitSql», которое позволяет запускать некоторый SQL после того, как соединение с базой данных проверено. Затем решение должно привязать схему к пулу jdbc. Надеюсь, это поможет. – rjdkolb

+0

@Chris. Вы можете запускать запрос ALTER SESSION SET CURRENT_SCHEMA каждый раз, когда вам нужно изменить схему (потому что она работает после создания EntityManager) или создать разные EntityManager для каждого пользователя (?). –

1

Я не уверен, что это решит вашу проблему, но некоторые поставщики серверов приложений могут что-то назвать InitSql.

Это инструкция SQL, которая запускается при каждом успешном соединении с базой данных.

  • В Weblogic 12с это называется InitSql
  • В Tomcat 7 это также называется InitSql

Я не могу найти что-то подобное для EclipseLink в Java SE, но, возможно, есть почта checkout SQL, который может быть запущен как InitSql

Как Андреас Л.Ответ может дать вам возможность запускать команды вроде.

ALTER SESSION SET CURRENT_SCHEMA=xxx