JPA - есть ли способ / метод для получения информации о единице сохраняемости - PullRequest
2 голосов
/ 18 мая 2011

Я хотел бы узнать имя моего источника данных в коде.Есть ли способ сделать это?Я использую eclipselink.

спасибо Если быть более точным, моя цель - получить объект соединения jdbc.Я знаю, что могу сделать это через:

datasource = (DataSource) (new InitialContext()).lookup("my_data_source_name")
connection = dataSource.getConnection();

Но я не хочу жестко кодировать имя источника данных в моем коде.

Я также пытался

java.sql.Connection connection = em.unwrap(java.sql.Connection.class);

и всегда возвращает ноль.

Ответы [ 3 ]

6 голосов
/ 31 марта 2013

.unwrap() должен быть подходящим способом, как написано в EclipseLink wiki .

Я также использовал null при вызове em.unwrap(java.sql.Connection.class);, поскольку он был не внутри транзакции . Когда называется так:

em.getTransaction().begin();
java.sql.Connection conn = em.unwrap(java.sql.Connection.class);
// ...
em.getTransaction().commit();

все отлично работает!

2 голосов
/ 19 мая 2011
java.sql.Connection connection = em.unwrap(java.sql.Connection.class);

Должно работать, какую версию вы используете? Убедитесь, что транзакция активна.

Чтобы получить имя источника данных, которое вы должны использовать,

((JNDIConnector)em.unwrap(JpaEntityManager.class).getSession().getLogin().getConnector()).getName();
0 голосов
/ 18 мая 2011

Вот , что я нашел полезным:

private DataSource createDataSource() {
ClientDataSource dataSource = new ClientDataSource();
dataSource.setServerName("localhost");
dataSource.setPortNumber(1527);
dataSource.setDatabaseName("sample");
dataSource.setUser("app");
dataSource.setPassword("app");
return dataSource;
}

private EntityManagerFactory getEntityManagerFactory() {
if (emf == null) {
  Map properties = new HashMap();
  properties
     .put(PersistenceUnitProperties.NON_JTA_DATASOURCE,createDataSource());
  emf = Persistence.createEntityManagerFactory(PU_NAME, properties);
}
return emf;
}

Можете ли вы создать свой источник данных в коде, а не настроить его через persistence.xml?

...