С EclipseLink отправлять заявление в базу данных при каждом новом подключении - PullRequest
1 голос
/ 01 июня 2011

Я использую EclipseLink для доступа к базе данных SQLite. SQLite по умолчанию из-за обратной совместимости не обеспечивает ограничения внешнего ключа. Ограничения внешних ключей можно включить для каждого соединения с помощью connection.createStatement().execute("PRAGMA foreign_keys=ON").

При использовании JDBC следующий код помогает:

Connection connection = DriverManager.getConnection("jdbc:sqlite:example.db");
Statement statement = connection.createStatement();
statement.execute("PRAGMA foreign_keys=ON");
// From now on, foreign key constraints are enforced on 'connection'

Как бы я получил такой же эффект с JPA / EclipseLink?

Ответы [ 3 ]

1 голос
/ 20 февраля 2014

в файле persistence.xml> единица хранения> свойства, добавьте:

<property name="eclipselink.session-event-listener"
value="com.example.MySessionEventAdapter"/>

Создать класс MySessionEventAdapter:

package com.example;

import org.eclipse.persistence.sessions.SessionEvent;
import org.eclipse.persistence.sessions.SessionEventAdapter;

public class MySessionEventAdapter extends SessionEventAdapter {

    @Override
    public void postAcquireClientSession(SessionEvent event) {

        event.getSession().executeNonSelectingSQL("PRAGMA foreign_keys=ON");

        super.postAcquireClientSession(event);

    }
}
0 голосов
/ 03 июня 2011

Драйвер Xerial JDBC для SQLite поддерживает установку PRAGMA "foreign_keys" как свойства в DriverManager.getConnection ():

Properties props = new Properties();
props.put("foreign_keys", "true");
DriverManager.getConnection("jdbc:sqlite:example.db", props);
...

См. Также java.org.sqlite.SQLiteConfig .

Есть ли способ добавить такие специфичные для JDBC-Driver свойства соединения в файл persistance.xml с EclipseLink?
Тривиальный подход, просто добавив его в раздел свойств, у меня не сработал.

0 голосов
/ 02 июня 2011

Вы можете использовать собственный запрос.

em.createNativeQuery ("PRAGMA foreign_keys = ON"). ExecuteUpdate ();

Вы также можете зарегистрировать EclipseLink SessionEventListener в своем файле persistence.xml, чтобы это всегда делалось для каждого соединения (событие postAcquireConnection).

Вы также можете настроить его в своей базе данных, чтобы избежать необходимости выполнять этот SQL при каждом соединении.

...