2011-06-01 20 views
1

我正在使用EclipseLink訪問SQLite數據庫。默認情況下,由於SQLite的向後兼容性,SQLite不強制執行外鍵約束。可以使用connection.createStatement().execute("PRAGMA foreign_keys=ON")以每個連接爲基礎啓用外鍵約束。使用EclipseLink,將語句發送到每個新連接上的數據庫

當使用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的同樣的效果?

回答

0

您可以使用本機查詢。

em.createNativeQuery(「PRAGMA foreign_keys = ON」)。executeUpdate();

您也可以在persistence.xml中註冊一個EclipseLink SessionEventListener,以便始終爲每個連接完成此任務(postAcquireConnection事件)。

您也可以在數據庫上對其進行配置,以避免必須在每個連接上執行此SQL。

+0

我會在哪裏把那條線?我嘗試將它放入'SessionEventAdapter'的'postConnect()';但是我從哪裏得到'EntityManager'呢?當調用'Persistence.createEntityManagerFactory(「example」)。createEntityManager()'時,'postConnect()'事件被觸發。謝謝! – Feuermurmel 2011-06-03 20:42:37

0

的Xerial JDBC驅動器爲SQLite支持來設置 「foreign_keys」 PRAGMA如的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?
簡單的方法,只是將它添加到屬性部分,並不適用於我。

1
persistence.xml中> persitence單位>屬性

,添加:

<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); 

    } 
} 
相關問題