JPA/Eclipselink: Angabe des DB-Schemas

Aus Architekturgründen ist es manchmal sinnvoll, die Daten in einer Datenbank in unterschiedliche Schemata aufzuteilen. Will man nun explizit das Schema in den JPA-Queries angeben, bietet Eclipselink eine Konfigurationsmöglichkeit über dir orm.xml.

In einem einfachen Beispiel sollen in einem Schema DEFAULT die Accountdaten (Name, Anschrift, etc.) gespeichert werden. In einem separaten Schema SECURE sollen die Logindaten des Nutzers abgespeichert werden.

Damit die Schemanamen in den Queries genutzt werden, muss die Mappingdatei orm.xml für Eclipselink wie folgt angepasst werden:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_0.xsd"
    version="2.0">
    <entity class="de.ronnyfriedland.entity.Account">
        <table schema="DEFAULT"></table>
    </entity>
    <entity class="de.ronnyfriedland.entity.Credentials">
        <table schema="SECURE"></table>
    </entity>
</entity-mappings>

Alternativ kann das Schema auch in der javax.persistence.Table Annotation angegeben werden. Dabei ist aber zu beachten, dass die Angaben in der XML immer die Annotationen überschreiben. Es ist also nicht möglich, den Tabellennamen an der Entity anzugeben, das Schema aber im XML.

Ich bevorzuge in diesem Fall die Konfiguration über XML, da so DB-Interna nicht mit dem Java-Code vermischt werden. Außerdem ist so eine Parametrisierung der Schemata im Buildprozess möglich.